Is there a maximum character limit to random seed?
Question:
Is there a maximum number of characters (and therfore value) to the seed in Python?
import random
random.seed(13) # fine
random.seed(1234567890) # also fine
random.seed(31415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679821480865132823066470938446095505822317253594081284811174502841027019385211055596446229489549303819644288109756659334461284756482337867831652712019091456485669234603486104543266482133936072602491412737245870066063155881748815209209628292540917153643678925903600113305305488204665213841469519415116094330572703657595919530921861173819326117931051185480744623799627495673518857527248912279381830119491298336733624406566430860213949463952247371907021798609437027705392171762931767523846748184676694051320005681271452635608277857713427577896091736371787214684409012249534301465495853710507922796892589235420199561121290219608640344181598136297747713099605187072113499999983729780499510597317328160963185950244594553469083026425223082533446850352619311881710100031378387528865875332083814206171776691473035982534904287554687311595628638823537875937519577818577805321712268066130019278766111959092164201989)
# also fine
I’m not sure why someone would pick such a high value, but I just want to know if has a limit.
Answers:
Since random.seed
expects None
, int
, or long
, there is technically no defined limit for the seed, since long
can be very large, depending on the available address space, which serves as a practical limit. There is also no indication of a checked limit in the function anyway.
There is no max limit, but the input is eventually truncated to 20,000 bits.
Even if you don’t understand the algorithm (I don’t), you can follow along in the source code.
First, CPython splits the input into 32-bit chunks, and creates a bytearray out of them: https://github.com/python/cpython/blob/55edd0c185ad2d895b5d73e47d67049bc156b654/Modules/_randommodule.c#L258-L293
Then, the Mersene Twister PRNG is seeded with the number 19,650,218, after which some mathematical stuff happens that is well above my understanding: https://github.com/python/cpython/blob/55edd0c185ad2d895b5d73e47d67049bc156b654/Modules/_randommodule.c#L172-L196
But in the midst of all that action, notice this line: https://github.com/python/cpython/blob/55edd0c185ad2d895b5d73e47d67049bc156b654/Modules/_randommodule.c#L180
Anything after the N
th element is never looped over, and therefore effectively discarded. In this case is N is 624 (it’s a magic constant: https://github.com/python/cpython/blob/55edd0c185ad2d895b5d73e47d67049bc156b654/Modules/_randommodule.c#L76), so no more than 625 * 32 = 20,000
input bytes are used.
Since the comment in the code says “from the right”, we will take them at their word (this is all pretty far above my head, so I’m in no position to question them). Therefore I feel confident enough to conclude that the rightmost 20,000 bits of the input are used, and the rest discarded.
That said, I imagine the definition of “rightmost” is platform-dependent, so it’s probably not behavior you should rely on.
While if use the numpy provision of random number generation using the np.random.seed(x). The values of seed is limited to 0 and 2**32 – 1.
Is there a maximum number of characters (and therfore value) to the seed in Python?
import random
random.seed(13) # fine
random.seed(1234567890) # also fine
random.seed(31415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679821480865132823066470938446095505822317253594081284811174502841027019385211055596446229489549303819644288109756659334461284756482337867831652712019091456485669234603486104543266482133936072602491412737245870066063155881748815209209628292540917153643678925903600113305305488204665213841469519415116094330572703657595919530921861173819326117931051185480744623799627495673518857527248912279381830119491298336733624406566430860213949463952247371907021798609437027705392171762931767523846748184676694051320005681271452635608277857713427577896091736371787214684409012249534301465495853710507922796892589235420199561121290219608640344181598136297747713099605187072113499999983729780499510597317328160963185950244594553469083026425223082533446850352619311881710100031378387528865875332083814206171776691473035982534904287554687311595628638823537875937519577818577805321712268066130019278766111959092164201989)
# also fine
I’m not sure why someone would pick such a high value, but I just want to know if has a limit.
Since random.seed
expects None
, int
, or long
, there is technically no defined limit for the seed, since long
can be very large, depending on the available address space, which serves as a practical limit. There is also no indication of a checked limit in the function anyway.
There is no max limit, but the input is eventually truncated to 20,000 bits.
Even if you don’t understand the algorithm (I don’t), you can follow along in the source code.
First, CPython splits the input into 32-bit chunks, and creates a bytearray out of them: https://github.com/python/cpython/blob/55edd0c185ad2d895b5d73e47d67049bc156b654/Modules/_randommodule.c#L258-L293
Then, the Mersene Twister PRNG is seeded with the number 19,650,218, after which some mathematical stuff happens that is well above my understanding: https://github.com/python/cpython/blob/55edd0c185ad2d895b5d73e47d67049bc156b654/Modules/_randommodule.c#L172-L196
But in the midst of all that action, notice this line: https://github.com/python/cpython/blob/55edd0c185ad2d895b5d73e47d67049bc156b654/Modules/_randommodule.c#L180
Anything after the N
th element is never looped over, and therefore effectively discarded. In this case is N is 624 (it’s a magic constant: https://github.com/python/cpython/blob/55edd0c185ad2d895b5d73e47d67049bc156b654/Modules/_randommodule.c#L76), so no more than 625 * 32 = 20,000
input bytes are used.
Since the comment in the code says “from the right”, we will take them at their word (this is all pretty far above my head, so I’m in no position to question them). Therefore I feel confident enough to conclude that the rightmost 20,000 bits of the input are used, and the rest discarded.
That said, I imagine the definition of “rightmost” is platform-dependent, so it’s probably not behavior you should rely on.
While if use the numpy provision of random number generation using the np.random.seed(x). The values of seed is limited to 0 and 2**32 – 1.