假设一个语言无关的设置,其中rand()
函数具有完美的实现并返回一个非常大的(比如128位),强随机无符号整数,我应该有相当低的机会获得相同的数字两次考虑RNG的周期将是天文数字巨大。
a = rand(); // very very low chances of getting twice the same number
但是,如果我对两个这样的随机整数进行异或运算,那么oputput的熵会有多大降低?换句话说,这种功能的可能性有多差:
def xorRand(): return rand() ^ rand();
与单独的假设rand()
相比,返回两倍相同的数字?
答案 0 :(得分:4)
假设您有1位PRNG。可能的结果是:
1 ^ 1 -> 0
1 ^ 0 -> 1
0 ^ 1 -> 1
0 ^ 0 -> 0
所以它看起来好像没什么区别。
答案 1 :(得分:3)
如果你说rand()
函数是一个很好的实现,那么使用rand()
或xorRand()
之间没有区别,只是后者需要两倍的时间。
如果使用了所有128个输出位,rand()
将以相同的概率返回每个数字,因此它将有机会1:2 ** 128返回与之前相同的数字。与xorRand()
相同,因为XOR函数是“对称的”,并为两个均匀分布的输入返回均匀分布的输出。
只有在您使用错误的rand()
实施或不同的“不对称”运算符(例如AND)时,这才会改变。
请注意,使用xorRand()
通常会为错误的rand()
实施提供改进熵。想象一个rand()
交替返回一个好的随机数和0。
顺便说一句,如果你想阻止你的随机函数两次产生相同的数字,那就自己动手吧,f.e。通过使用shuffle算法。有许多SO问题和答案可以解决这个问题(如this one)。