伪随机数发生器不太可能重复吗?

时间:2016-10-31 04:05:39

标签: random

所以他们说如果你将硬币翻转50次并获得50次,那么下一次翻转你仍然是50/50,接下来的两次是1/4。你是否认为/知道同样的原理是否适用于计算机伪随机数发生器?我认为他们不太可能长时间重复相同的数字。

我跑了几次,结果是可信的,但我想知道有多少次我必须运行它以获得异常输出。

def genString(iterations):
   mystring = ''
   for _ in range(iterations):
       mystring += str(random.randint(0,9))
   return mystring


def repeatMax(mystring):
    tempchar = ''
    max = 0
    for char in mystring:
            if char == tempchar:
                    count += 1
                    if count > max:
                            max = count
            else:
                count = 0
            tempchar = char
    return max


for _ in range(10):
    stringer = genString()
    print repeatMax(stringer)

我得到了全部7个和6个。如果我运行1000次,它是否接近正态分布,还是我希望它能保持相对可预测性?我试图理解伪随机数生成的可预测性。

1 个答案:

答案 0 :(得分:0)

未能产生特定模式是PRNG的一个典型弱点,但是随机输入大量重复数字的可能性非常小,很难证明这种弱点。

PRNG仅使用32位状态是完全合理的,传统上这意味着生成一个包含40亿个数字的序列,然后再从头开始重复。在这种情况下,你的50个硬币翻转的顺序是可能永远不会发生(对于具有千万亿次机会的东西的40亿次尝试不太可能成功);但如果确实如此,那么会经常出现

表面上你正在寻找k维等分布作为一种测试,以确定你是否可以期望在输出中找到规定的模式而不需要对特定发生器进行更深入的分析。如果您的发电机声称至少有50维等分布,那么您可以保证至少看到50头状态。

但是,如果您的生成器发出32位结果,但您只测试每个结果是否映射到头部或尾部,即使生成器未通过k维度测试,您也有成功的机会,并且该机会取决于具体情况生成器和映射函数。

如果您调整生成器的实现以一次只返回一位,那么您有机会尝试从50位状态中挤出50个磁头(或者可能只有18个,但该生成器会可能是有缺陷的)。如果发电机访问所有2 ** 50个可能的状态,其中一个状态将连续产生50个磁头。当相邻的状态以更多的零开始或结束时,你可能会得到更多的头。