首页 > 解决方案 > 如何找到使随机数序列保持在 C 中的下一个种子?

问题描述

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

这意味着他希望我们使用不会产生重叠序列的种子。例如:如果我用种子 X 初始化随机数生成器并生成序列 [3, 5, 9, 2, 0],则下一个种子 Y 不能包含(并继续)这个相同的序列。他确实给我们的一个建议是模拟整个队列运行,最后找到一个种子,它将从它停止的数字继续序列。假设我们使用种子 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());
}

上面的代码产生以下输出:

0: 1215069295
1: 1311962008
2: 1086128678
3: 385788725 -> new seed!
4: 1753820418

0: 1008718395
1: 1489456950
2: 1335983464
3: 366125540
4: 20514025

这不是我所期待的。根据我教授的解释,第二个序列应该以数字 1753820418 开头,因为它是前一个序列的最后一个。这个对吗?是否有另一种方法可以找出哪个种子将继续 C 中前一个种子的序列?

非常感谢你的帮助!

标签: crandom

解决方案


i == 3,您调用rand()以获取随机数,将其存储在名为 的变量中new_seed。但是,从返回的值rand不一定种子值。如果你想让它成为一粒种子,你需要把它变成一个:

    new_seed = rand();
    printf("%d: %d -> new seed!\n",i, new_seed);
    srand(new_seed);

然后下一次调用rand将根据该种子返回一个新的随机数。

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


推荐阅读