gpt4 book ai didi

c++ - 确定性随机数生成器为同一种子提供不同的随机数

转载 作者:行者123 更新时间:2023-11-30 17:48:42 25 4
gpt4 key购买 nike

我想为我的应用程序使用确定性随机位生成器。我正在使用 openssl 作为随机数生成器 api。目前我正在使用 RAND_pseuso_bytes() api 来生成伪随机数。我通过 RAND_add() 提供种子。然后,如果我调用随机生成器函数两次,我会在这两次调用中获得两个不同的随机值。如果种子相同,那么它应该给我相同的值,我哪里出错了?

我写的代码是

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(),它将重复相同的序列。

关于c++ - 确定性随机数生成器为同一种子提供不同的随机数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18437638/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com