c - 如何找到使随机数序列保持在 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 中前一个种子的序列?
非常感谢你的帮助!
解决方案
时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 位。
推荐阅读
- python - 如何在启动 gunicorn 之前设置 Django 服务器状态
- python - 如何在 Maya 中添加事件过滤器
- ios - 如何随机移动(翻译)图片,屏幕的任何位置?
- android - Android:为什么我不能以编程方式滚动这个 WebView?
- networking - 基于文件名的主机特定目标
- python - Django:.filter(key__in=set) 和 .filter(key__in=list) 之间的性能是否存在差异
- azure-devops - 删除包含无效字符的发布文件夹
- swift - 附近设备的iOS蓝牙mac地址
- java - 如果文件名模式与 Camel 不匹配,如何将文件移动到错误目录
- visual-studio - 如何在 VS Code 中使用标签包装选定的文本并有效地重复操作?