是否遵循均匀分布::random_device 和 std::mt19937
Do std::random_device and std::mt19937 follow an uniform distribution?
我正在尝试用C++转换这行 matlab:rp = randperm(p);
按照randperm
文档:
兰德珀姆使用与兰德相同的随机数生成器
在rand
页面中:
兰德返回单个均匀分布的随机数
因此rand
遵循均匀分布。我的C++代码基于:
std::random_device rd;
std::mt19937 g(rd());
std::shuffle(... , ... ,g);
我的问题是:上面的代码遵循均匀分布?如果没有,该怎么做?
C++随机数库中的不同类大致如下:
-
std::random_device
是一个均匀分布的随机数生成器,可以访问系统中的硬件设备,或者类似于 Linux 上的/dev/random
设备。它通常只是用于播种伪随机生成器,因为底层设备通常会很快耗尽熵。 -
std::mt19937
是一个使用Mersenne Twister引擎的快速伪随机数生成器,根据原作者的论文标题,该引擎也是统一的。 这将生成完全随机的 32 位或 64 位无符号整数。 由于std::random_device
仅用于为该生成器设定种子,因此它本身不必是均匀的(例如,您经常使用当前时间戳为生成器设定种子,这绝对不是均匀分布的)。 - 通常,您使用诸如
std::mt19937
之类的生成器来馈送特定的分布,例如std::uniform_int_distribution
或std::normal_distribution
,然后采用所需的分布形状。 -
std::shuffle
,根据文件,对给定范围内的元素重新排序
[first, last)
以便这些元素的每个可能的排列具有相等的出现概率。
在代码示例中,您使用 std::mt19937
PRNG 馈送std::shuffle
。 所以,std::mt19937
是统一的,std::shuffle
也应该表现得统一。 所以,一切都尽可能统一。
相关文章:
- 使用std::multimap迭代器创建std::list
- C++中std::resize(n)和std::shrink_to_fit之间的区别
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 如何导出包含具有"std::unique_ptr"值的"std::map"属性的
- 从持续时间构造std::chrono::system_clock::time_point
- std::具有相同基类的类的变体
- std::向量与传递值的动态数组
- 使用std::vector的OpenCL矩阵乘法
- std::map<struct,struct>::find 找不到匹配项,但是如果我循环通过 begin() 到 end(),我在那里看到匹配项
- std::condition_variable::wait()如何评估给定的谓词
- 如何获取std::result_of函数的返回类型
- std::原子加载和存储都需要吗
- 将对象移动到std::shared_ptr
- POCO::PostgreSQL:如何将std::vector支持添加到`Binder::bind`
- 使用一个考虑到std::map中键值的滚动或换行的键
- 如何从 std::atomic 中提取指针 T<T>?
- 为什么 std::unique 不调用 std::sort?
- 使用std::函数映射对象方法
- 可组合的lambda/std::函数与std::可选