4

我很难弄清楚下面的代码是如何工作的:

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被 , 整除时15random将使用相同的索引,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可以被3or整除5呢?

种子有什么魔力1178741599

编辑:正如 jonrsharpe 指出的,fizzbuzz 代码仅适用于 python 2.x

4

2 回答 2

7
random.seed(n)

意思是“将随机数生成器重置到某个已知位置n”。这意味着可以提前知道生成器的未来输出。它对于一遍又一遍地使用相同的“随机”数据进行测试很有用。

这段代码的作用是每 15 步重置生成器,因此每次都得到相同的 15 个“随机”整数序列(因此,列表中的字符串)。在 Python 2.x 中,重置后的第一个“随机”整数总是0(当我刚刚在 Python 3 中尝试时,在random.seed(1178741599)我得到之后random.randint(0, 3) == 1)。

请注意,此代码不会像传统的 FizzBu​​zz 程序那样做,并且在很大程度上取决于random实现。它在 2.7.3 中对我有用,但在 3.3.2中不起作用(请参阅为什么random在 Python 版本之间播种数字生成器不稳定?)。

于 2014-01-06T19:35:58.963 回答
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 个种子。

于 2014-01-06T21:03:51.243 回答