Random rand()^rand()的熵减少了多少?

Random rand()^rand()的熵减少了多少?,random,cryptography,Random,Cryptography,假设语言不可知的设置中,rand()函数有一个完美的实现,并返回一个非常大(比如说128位)的强随机无符号整数,考虑到RNG的周期非常大,我获得相同数字两次的机会应该相当低 a = rand(); // very very low chances of getting twice the same number 然而,如果我对两个这样的随机整数进行异或运算,运算结果的熵会有多大程度的降低?换句话说,这种功能发生以下情况的可能性有多大: def xorRand(): return rand()

假设语言不可知的设置中,
rand()
函数有一个完美的实现,并返回一个非常大(比如说128位)的强随机无符号整数,考虑到RNG的周期非常大,我获得相同数字两次的机会应该相当低

a = rand(); // very very low chances of getting twice the same number
然而,如果我对两个这样的随机整数进行异或运算,运算结果的熵会有多大程度的降低?换句话说,这种功能发生以下情况的可能性有多大:

def xorRand(): return rand() ^ rand();

与我假设的
rand()。可能的结果是:

1 ^ 1  -> 0
1 ^ 0  -> 1
0 ^ 1  -> 1
0 ^ 0  -> 0

因此,在我看来,这似乎没有什么区别。

假设您有一个1位PRNG。可能的结果是:

1 ^ 1  -> 0
1 ^ 0  -> 1
0 ^ 1  -> 1
0 ^ 0  -> 0
因此,在我看来,这似乎没有什么区别。

如果
rand()
函数如您所说是一个很好的实现,那么使用
rand()
xorRand()
之间没有区别,只是后者需要两倍的时间

如果使用了所有128个输出位,
rand()
将以相同的概率返回每个数字,因此它将有机会1:2**128返回与以前相同的数字。与
xorRand()
相同,因为XOR函数是“对称”的,并为两个均匀分布的输入返回均匀分布的输出

只有在使用错误的
rand()
实现或不同的“非对称”运算符(如AND)时,才会更改此选项

请注意,经常使用
xorRand()
甚至会提高坏
rand()
实现的熵,例如,设想一个
rand()
交替返回一个好的随机数和0

顺便说一句,如果你想阻止你的随机函数生成相同的数字两次,你可以自己做,例如使用洗牌算法。有很多问题和答案可以解决这个问题(比如)。

如果
rand()
函数如您所说是一个很好的实现,那么使用
rand()
xorRand()
之间没有区别,只是后者需要两倍的时间

如果使用了所有128个输出位,
rand()
将以相同的概率返回每个数字,因此它将有机会1:2**128返回与以前相同的数字。与
xorRand()
相同,因为XOR函数是“对称”的,并为两个均匀分布的输入返回均匀分布的输出

只有在使用错误的
rand()
实现或不同的“非对称”运算符(如AND)时,才会更改此选项

请注意,经常使用
xorRand()
甚至会提高坏
rand()
实现的熵,例如,设想一个
rand()
交替返回一个好的随机数和0


顺便说一句,如果你想阻止你的随机函数生成相同的数字两次,你可以自己做,例如使用洗牌算法。有很多问题和答案可以解决这个问题(比如)。

你为什么要这样做?我怀疑熵能从中得到任何改善(如果是这样的话,发电机会已经做了,不是吗?),因此它对PRNG也没有用处。我知道熵不能增加,我怀疑它会更糟,因此我不会这样做。我只是想知道情况会有多糟。这更像是一个理论问题,而不是一个实际问题。就像概率中的所有事情一样,概率是50:50:要么发生,要么不发生。@Marc因此,既然每个人都不是被怪胎獾袭击致死,50%的人被獾杀死。当獾突然遇到蘑菇时,他们会非常生气……你为什么要这样做?我怀疑熵能从中得到任何改善(如果是这样的话,发电机会已经做了,不是吗?),因此它对PRNG也没有用处。我知道熵不能增加,我怀疑它会更糟,因此我不会这样做。我只是想知道情况会有多糟。这与其说是一个实际问题,不如说是一个理论问题。就像概率中的一切一样,概率是50:50:要么发生,要么不发生。@Marc因此,既然每个人都不是被獾袭击致死,50%的人是被獾杀死的。獾们会在突然面对蘑菇时非常生气……这是有道理的。值得一提的是,我在阅读了这个问题后得出了同样的结论(尽管我的证明并不那么简单),理由充分。值得一提的是,我在阅读了这个问题后得出了相同的结论(尽管我的证明远没有那么简单)。