我已经检查了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)方法或其他东西,我将非常感激。请记住,生成的数字必须是唯一的。
答案 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}进行了大量调用})。
期待您对此的看法。