I am having a hard time figuring out how the code below works:
import random
for i in range(0, 100):
if not i % 15:
random.seed(1178741599)
print [i+1, "Fizz", "Buzz", "FizzBuzz"][random.randint(0,3)]
I understand that when i
is divisible by 15
, random
will use the same seed
and hence randint(0, 3)
will always return the same index, but when I tried
for i in range(100):
random.seed(1178741599)
print random.randint(0,3) #always print 0
the above code always prints 0
, shouldn't it be (this is the correct behavior, and corresponds to 3
(as the "FizzBuzz"
's index in list [i+1, "Fizz", "Buzz", "FizzBuzz"]
?i+1
in the list.)
And what about when i
is divisible by 3
or 5
?
What is the magic of seed 1178741599
?
Edit: as jonrsharpe pointed out, the fizzbuzz code only works in python 2.x
random.seed(n)
Means "reset the random number generator to some known position n
". This means that the future outputs of the generator can be known in advance. It is useful for testing with the same "random" data over and over again.
What this code does is reset the generator every 15 steps, so you get the same sequence of 15 "random" integers (and, hence, of strings from the list) each time. In Python 2.x, the first "random" integer after the reset is always 0
(when I tried just now in Python 3, after random.seed(1178741599)
I get random.randint(0, 3) == 1
).
Note that this code does not do what a conventional FizzBuzz program does, and depends heavily on the random
implementation. It works for me in 2.7.3 but does not work in 3.3.2 (see Why is seeding the random
number generator not stable between versions of Python?).
Here's a naive way to go about finding the seed for your random number generator:
import random
expected = [0, 0, 1, 0, 2,
1, 0, 0, 1, 2,
0, 1, 0, 0, 3]
def is_working_seed(s):
random.seed(s)
return all(random.randint(0, 3) == e for e in expected)
seed = 0
while not is_working_seed(seed):
seed += 1
print seed
(obviously, looping over all 2^32 values of seed is not a good plan)
Since there are 4**15 == 1073741824
ways to generate a list of random numbers in 0:4
, you'd expect there to be about 4 seeds in the space of 32-bit numbers.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With