rand()^ rand()的熵有多少显着下降?

时间:2011-05-09 15:53:03

标签: random cryptography

假设一个语言无关的设置,其中rand()函数具有完美的实现并返回一个非常大的(比如128位),强随机无符号整数,我应该有相当低的机会获得相同的数字两次考虑RNG的周期将是天文数字巨大。

a = rand(); // very very low chances of getting twice the same number

但是,如果我对两个这样的随机整数进行异或运算,那么oputput的熵会有多大降低?换句话说,这种功能的可能性有多差:

def xorRand(): return rand() ^ rand();
与单独的假设rand()相比,

返回两倍相同的数字?

2 个答案:

答案 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)。