【问题标题】:determinisitic random number generator giving different random number for same seed确定性随机数生成器为同一种子提供不同的随机数
【发布时间】:2013-08-28 13:26:02
【问题描述】:

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

我写的代码是

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_bytes() 生成一个新种子,然后使用RAND_pseudo_bytes() 生成一系列伪随机值。这是正常使用。你想以不同的方式完成什么?

标签: c++ c random openssl


【解决方案1】:

但您不是使用相同的种子调用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(),它将重复相同的序列。

【讨论】:

    【解决方案2】:

    您可能希望在每次调用它时为其播种,否则每次调用它时都应返回一个随机数。

    【讨论】:

    • 感谢@Karthik,但我每次都尝试在调用随机生成函数之前播种...仍然无法正常工作...
    【解决方案3】:

    在您的代码中

    RAND_bytes(cSeed_64, nSize);
    RAND_add(cSeed_64, nSize, nEntropy);
    

    您正在使用RAND_bytes 生成一个随机数。您正在将此随机数添加到种子中。由于您正在为已经随机的事物添加随机性,因此它应该每次都生成随机数。所以,种子每次都不相同,因为它是随机的。

    要保持种子不变,请尝试使用固定种子的RAND_seed 以获得预期的行为。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-08
      • 1970-01-01
      • 2021-05-15
      • 1970-01-01
      • 1970-01-01
      • 2010-12-10
      相关资源
      最近更新 更多