c++ RNG:如何在不同的处理器上获得不同的rand生成器
C++ RNG: how to get different rand generators on different processors?
我如何播种随机生成器,以便我在不同的处理器上有不同的数字序列?
我的第一个尝试是使用处理器的排名作为种子。然后我艰难地发现srand(0)
和srand(1)
给出了相同的序列。
当前,我正在这样做:
srand(time(NULL) + rank)
这是一个OK的方法吗?还是有更好的办法?由于
生成rand()
初始化time(NULL)
的不同种子,并将该种子传递给您的进程/线程。是的,使用不同于rand()
的内容
在多线程环境中调用time()来播种RNG是自找麻烦。线程可以得到相同的时间,也可以得到不同的时间,这很难控制。就像你最初所做的那样,使用处理器排名为RNG提供种子,但要么使用一个对任何种子都表现良好的像样的RNG,要么如果你必须使用rand(),只需调整排名以获得稍微更好的种子,例如rank * 5 + 123;
如果您在*nix环境上,请使用/dev/random
或/dev/urandom
作为您的熵源。在Windows上,调用CryptGenRandom()
相关文章:
- #定义c-预处理器常量..我做错了什么
- 预处理器:插入结构名称中的前一个行号
- 如何在c++中实现处理器调度模拟器
- C/C++预处理器是否可以检测一些编译器选项
- 为什么我不能将 rand() 与数组的大小一起使用?
- 要与"if constexpr"一起使用的编译时消息(在预处理器之后)
- 在clang++预处理器中确定gcc工具链版本
- 不同/较旧的处理器运行c++代码的方式是否不同
- 用于交叉编译和CMake的预处理器宏的单元测试
- 为什么新的随机库比std::rand()更好
- 有没有办法在从编译器获取参数时避免预处理器宏?
- 如何比较两个同名的预处理器宏?
- 从预处理器获取 Windows 版本(C++ Win32)
- 为什么rand()的使用被认为是不好的
- 如何摆脱为条件编译定义预处理器宏的需要?
- C++使用 rand 定义函数语法
- C 预处理器 - 现有定义的预置路径
- VS2015 预处理器定义与点
- 不带预处理器的调用方法/文件的文件名/行号
- c++ RNG:如何在不同的处理器上获得不同的rand生成器