CMAC:非常长整数作为random()函数的种子

时间:2013-10-14 19:40:25

标签: c++ random neural-network

我已经检查了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)方法或其他东西,我将非常感激。请记住,生成的数字必须是唯一的。

1 个答案:

答案 0 :(得分: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的大小在你的机器上)。您可以通过不选择每个循环中生成的第一个随机数来使其“更随机”,但是Nth(因此在数字块周围交换不会产生相同的结果)。

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

请注意,虽然long int randomNumber随机产生random(),但int使用了random()。这允许多个随机数的总和而不用担心溢出 - 并且最终的模除法确保您最终得到的数字将(大致)均匀分布(特别是如果您最终对{{1}进行了大量调用})。

期待您对此的看法。