使用随机的Python中的fizzbuzz,它是如何工作的?

时间:2014-01-06 19:28:27

标签: python random-seed fizzbuzz

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

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何时可以被35整除呢?

种子1178741599的魔力是什么?

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

2 个答案:

答案 0 :(得分:6)

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中不起作用(参见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个种子。