我很难弄清楚下面的代码是如何工作的:
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
可被15
整除时,random
将使用相同的seed
,因此randint(0, 3)
将始终返回相同的索引,但我试过的时候
for i in range(100):
random.seed(1178741599)
print random.randint(0,3) #always print 0
以上代码始终打印0
,不应该是 (这是正确的行为,对应于列表中的3
(作为列表"FizzBuzz"
中的[i+1, "Fizz", "Buzz", "FizzBuzz"]
索引?i+1
。)
那么i
何时可以被3
或5
整除呢?
种子1178741599
的魔力是什么?
编辑:正如jonrsharpe所指出的,fizzbuzz代码仅适用于python 2.x
答案 0 :(得分:6)
random.seed(n)
表示“将随机数生成器重置为某个已知位置n
”。这意味着可以提前知道发电机的未来输出。它可以反复使用相同的“随机”数据进行测试。
这段代码的作用是每15步重置一次生成器,因此每次都得到相同的15“随机”整数序列(因此,列表中的字符串)。在Python 2.x中,重置后的第一个“随机”整数始终是0
(当我刚刚在Python 3中尝试时,在random.seed(1178741599)
之后我得到random.randint(0, 3) == 1
)。
请注意,此代码不会执行传统的FizzBuzz程序所做的操作,并且在很大程度上取决于random
实现。它适用于2.7.3但在3.3.2中不起作用(参见Why is seeding the random
number generator not stable between versions of Python?)。
答案 1 :(得分:1)
这是一种寻找随机数生成器种子的天真方法:
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
(显然,循环所有2 ^ 32个种子值不是一个好计划)
由于有4**15 == 1073741824
种方法可以在0:4
中生成随机数列表,因此您希望在32位数字的空间中有大约4个种子。