0

我检查了 stdlib 的文档,它说我们可以使用 unsigned long int 作为 srand() 的种子。问题是:我需要使用最多 40 位数字作为种子。该种子是从用于多变量 CMAC 问题调制的关联矩阵中检索的。

我该如何克服这个问题?例如,请参见下面的代码:

#include <stdlib.h>

int main(int argc, char ** argv)
{
    int inputVariable = getStateOfAdressedSpace();
    int generatedNumber;
    unsigned long long mySeed = getSeedFromMatrix( inputVariable );

    srandom( mySeed );
    generatedNumber = random( );
}

这是一个非常弱的例子,但那是因为整个代码太大而无法演示,想象一下 mySeed 变量将是一个很长的整数,这就是我的问题所在。如果有人告诉我如何解决这个问题,我将非常感激,甚至可能使用伪随机数生成器 (PRNG) 方法或其他方法。请记住,生成的编号必须是唯一的。

4

1 回答 1

0

实现“与随机无法区分”并使用任意长度种子的所有数字的简单方法如下(未经测试 - 这只是为了说明原理):

char* mySeed = "123454321543212345678908765434234576897654267349587623459872039487102367529364520";
char bitOfString[6];
int ii;
long int randomNumber=0;
for(ii=0; ii<strlen(mySeed)-5; ii+=5) {
  strncpy(bitOfString, mySeed+ii, 5);
  bitOfString[5]='\0';
  srandom(atoi(bitOfString));
  randomNumber += random();
}
randomNumber = randomNumber % RAND_MAX;

这会根据“小到足以成为种子的东西”生成随机数(我使用该数字5作为字符串长度,但您可以选择另一个数字;取决于int您机器上的大小)。您可以通过不只选择每个循环中生成的第一个随机数,而是选择第 N 个(这样交换数字块不会产生相同的结果)来使其“更加随机”。

底线是 - 您生成不同的随机序列。10 40 个种子中的每一个都会给出不同的随机数在数学上是不可能的——这种方法应该将“任意大小”的种子映射到随机数生成器范围内的均匀分布数。

请注意,我用于long int虽然randomNumberrandom()产生int随机数。这允许对多个随机数求和而不必担心溢出 - 并且最终的模除确保您最终得到的数字将(大约)均匀分布(特别是如果您最终对 进行大量调用random())。

期待您对此的看法。

于 2013-10-14T20:16:35.213 回答