c++ - 如何在个人电脑和集群上生成相同的随机数(c++)
问题描述
我想知道如何使用我的个人计算机和集群生成完全相同的随机数。
这是一个简单的代码。
#include <iostream>
#include <random>
int main()
{
int N = 10;
for (int j = 0; j < N; j++) std::cout << rand() % 10 << " ";;
}
我个人电脑的输出是:1 7 4 0 9 4 8 8 2 4
集群的输出是:3 6 7 5 3 5 6 2 9 1
这些随机数的差异将强烈影响我的计算。此外,我的问题非常灵活,我不能使用从我的个人计算机生成的随机数并将其用作集群的输入。我希望在不同的平台上生成相同的随机数。
/////////新尝试:我尝试了链接中的解决方案:如果我们在不同的机器上播种相同的c++11 mt19937,我们会得到相同的随机数序列
我使用了代码:
#include <random>
#include <iostream>
int main()
{
/* seed the PRNG (MT19937) using a fixed value (in our case, 0) */
std::mt19937 generator(0);
std::uniform_int_distribution<int> distribution(1, 10);
/* generate ten numbers in [1,10] (always the same sequence!) */
for (size_t i = 0; i < 10; ++i)
{
std::cout << distribution(generator) << ' ';
}
std::cout << std::endl;
return 0;
}
在我的电脑上,我得到了输出: 5 10 4 1 4 10 8 4 8 4
在集群上,我得到:6 6 8 9 7 9 6 9 5 7
尽管如此,它还是不同的。
谁能给我一个代码示例?
非常感谢。
解决方案
这个问题解释了您从中获得的一系列数字
std::uniform_int_distribution<int> distribution(1, 10);
即使您使用具有相同种子的相同 PRNG,也已定义实现。相比之下,PRNG 产生的随机数序列std::mersenne_twister_engine
在任何符合标准的实现中都有很好的定义。
因此,在不使用外部库的情况下获得定义良好的伪随机数序列的最简单方法是:
#include <iostream>
#include <random>
int main() {
std::mt19937 generator(0);
while (true) {
const auto rand = generator() % 10;
std::cout << rand << ' ';
}
}
保证此代码始终产生相同的序列,4 9 3 0 3 9 7 3 7 3 ...
. 这些数字不是均匀分布的,原因与生成的数字不同的原因相同rand() % 10
。如果您不太关心随机数的质量,这可能是一个可以接受的解决方案。
推荐阅读
- java - Spring Boot 缓存注解在使用 Redis 进行缓存的应用程序中的作用是什么?
- spring-boot - 如何在使用 gradle 创建多个子模块的可执行 jar 时排除子模块?
- node.js - NODE.JS(TYPESCRIPT) 类型“NodeModule”上不存在属性“req”
- swift - 用贝塞尔路径绘制动态蜘蛛图
- database - 如何实现自己的设置到 Scrapy 蜘蛛
- ios - iphone 设备模拟器上看不到按钮的文本
- math - 从数字序列中获取公式
- python - 如何从原始电影镜头生成 5 个子数据集?
- python - KNeighborsRegressor 作为去噪算法
- firebase - firebase 使用 where 获取一些数据