[英]determinisitic random number generator giving different random number for same seed
我想为我的应用程序使用确定性随机位生成器。 我正在将openssl用于随机数生成器api。 目前,我正在使用RAND_pseuso_bytes()API生成伪随机数。 我正在通过RAND_add()提供种子。 然后,如果我两次调用Random generator函数,那么在这两次调用中将获得两个不同的随机值。 如果种子是相同的,那么它应该给我相同的值,我哪里出错了?
我写的代码是
int nSize = 8; /* 64 bit random number is required */
int nEntropy = 5; /* 40 bit entropy required */
/* generate random nonce for making seed */
RAND_bytes(cSeed_64, nSize);
RAND_add(cSeed_64, nSize, nEntropy); /* random nonce is cSeed_64, seedin 64 bit with
* 40 bit entropy */
/* calling random byte function to generate random number function 10 times with same seed*/
int j = 10;
while( j--)
{
RAND_pseudo_bytes(cRandBytes_64, 8);
printf("generated 64 bit random number \n");
for(i = 0 ; i < nSize; i++)
printf("%x ",cRandBytes_64[i]);
printf("\n");
}
但是,您不是用相同的种子调用RAND_psuedo_bytes()
,而是对其进行了连续调用,这将产生不同的输出。 这就是“生成器”函数的全部要点-它会根据内部状态在每次调用时产生不同的值。
当您“种子”和随机数生成器时,您将修复其内部状态,此后它将通过扩展状态来生成随机数。 对于每个种子,它将通过重复调用生成唯一且可复制的数字序列 ,但是肯定不会在每次调用中生成相同的数字,这是没有意义的。
该行:
RAND_bytes(cSeed_64, nSize);
根据系统熵创建随机可见值。 您实际上应该在这里检查错误,因为如果没有足够的熵,它可能会失败。
线
RAND_add(cSeed_64, nSize, nEntropy);
不播种PRNG,而是将种子添加到现有的PRNG状态。 如果要将PRNG状态设置为固定值,则必须使用RAND_seed()
。 如果您使用给定值调用RAND_seed()
,则RAND_pseudo_bytes()
随后将生成给定的随机数序列 。 如果再次使用相同的值调用RAND_seed()
,它将重复相同的序列。
您可能希望在每次调用它时都将其作为种子,否则期望每次调用时都将返回一个随机数。
在你的代码中
RAND_bytes(cSeed_64, nSize);
RAND_add(cSeed_64, nSize, nEntropy);
您正在使用RAND_bytes
生成一个随机数。 您正在将此随机数添加到种子中。 由于您是在已经随机的事物上添加随机性,因此每次都应生成随机数。 因此,种子是随机的,因此每次都不相同。
要保持种子不变,请尝试使用固定种子的RAND_seed
以获得预期的行为。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.