如何找到下一个使随机数序列保持在C中的种子?

如何找到下一个使随机数序列保持在C中的种子?,c,random,C,Random,我有一个任务,我必须编程一个随机到达和服务时间的M/M/1队列。我的问题是:我的教授希望我们证明队列工作正常,并生成正确的统计数据(等待时间、队列中的平均人数等),而不考虑用于初始化随机数生成器的种子 这意味着他希望我们使用不会产生重叠序列的种子。例如:如果我用种子X初始化随机数生成器,它生成序列[3,5,9,2,0],则下一个种子Y不能包含(并继续)相同的序列。 他给我们的一个建议是模拟整个队列的运行,并在最后找到一个种子,该种子将从停止的数量继续序列。假设我们使用seed X运行时生成了与上

我有一个任务,我必须编程一个随机到达和服务时间的M/M/1队列。我的问题是:我的教授希望我们证明队列工作正常,并生成正确的统计数据(等待时间、队列中的平均人数等),而不考虑用于初始化随机数生成器的种子

这意味着他希望我们使用不会产生重叠序列的种子。例如:如果我用种子X初始化随机数生成器,它生成序列[3,5,9,2,0],则下一个种子Y不能包含(并继续)相同的序列。 他给我们的一个建议是模拟整个队列的运行,并在最后找到一个种子,该种子将从停止的数量继续序列。假设我们使用seed X运行时生成了与上面相同的序列,下一次对rand()的调用将返回数字19。他希望我们找到一个种子Y,它将产生19作为它的第一个随机数,然后从那里继续,因为这些序列不会重叠

作为另一个建议,他提到,如果你在上一次跑步中使用rand()生成的最后一个数字作为下一次跑步的种子,那么第一个数字将是上一个序列的延续,但我无法重现。我编写了以下代码作为测试,以查看此方法是否有效:

//Initialize the random number generator
srand(10);

int new_seed;

//Generate a small test sequence of random numbers
for(int i = 0; i < 5; i++){
    //Store the new seed for later use
    if(i == 3){
        new_seed = rand();
        printf("%d: %d -> new seed!\n",i, new_seed);
    }else{
        printf("%d: %d\n",i, rand());
    }
}

printf("\n");
//Reinitialize the number generator with the new seed
srand(new_seed);

//Generate another small test sequence of random numbers
for(int i = 0; i < 5; i++){
    printf("%d: %d\n",i, rand());
}

这不是我所期望的。根据我的教授的解释,第二个序列应该以1753820418开始,因为它是前一个序列的最后一个。 这是正确的吗?有没有其他方法可以确定哪个种子将继续C中前一个种子的顺序


非常感谢你的帮助

i==3
时,调用
rand()
获取随机数,将其存储在名为
new\u seed
的变量中。但是,从
rand
返回的值不一定是种子值。如果你想让它成为一颗种子,你需要让它成为一颗:

    new_seed = rand();
    printf("%d: %d -> new seed!\n",i, new_seed);
    srand(new_seed);
然后,对
rand
的下一次调用将基于该种子返回一个新的随机数


您的教授希望从
rand
返回的值与用于生成下一个随机值的“种子”相同,但情况并非如此。Visual Studio在内部使用32位值作为
rand
,但只从中间返回15位。

对于高质量的PRNG,不可能快速找到生成给定数字的种子
rand
是一个相当糟糕的PRNG,但是你无论如何都不应该打破它,除非你已经学习了这个特定的主题,打破PRNG。因此,你可以继续尝试所有可能的种子,或者写你自己的PRNG,这很容易打破。句子“这意味着他希望我们使用不会产生重叠序列的种子”在逻辑上与前面的句子不同。使用不会生成重叠序列的种子不足以保证软件正常工作。事实上,以各种顺序执行程序只是作为对软件的测试,而不是证明(除非详尽无遗,这似乎不太可能)。因此,实际的问题似乎是某些序列的重用削弱了测试,但潜在的重复如何削弱测试尚不清楚。使用不同的种子通常会产生不同的序列。一个序列在两个不同测试中完全重复的频率很小,不是一个重要因素。似乎不需要在新测试中从先前测试中中断的位置继续序列。只需使用不同的种子。@n.m:有什么理由或证据表明不可能快速找到产生给定数量的种子?随机数序列本身并不需要具有不可逆性等密码特性。常见的加密方案在加密方向上可以作为一个像样的随机数生成器使用,但在解密方向上是可逆的。很抱歉,也许我对我的问题不是很清楚,但我确实将
新的\u seed
设置为
调用之间的种子。不管怎样,现在我想起来了,从一个种子生成的数字继续一个种子序列没有多大意义,对吗?如果可能的话,任何PRNG都很容易中断,只需简单地调用
rand
,将该值设置为种子,然后按照完整的顺序执行。也许我误解了教授的意思。C或C++中是否有函数即使在重新启动程序后仍能继续一系列的数字?
    new_seed = rand();
    printf("%d: %d -> new seed!\n",i, new_seed);
    srand(new_seed);