c++ - std::random_device 和 std::mt19937 服从均匀分布吗?

标签 c++ matlab random uniform-distribution

我正在尝试用 C++ 转换这行 matlab:rp = randperm(p);

遵循 randperm documentation :

randperm uses the same random number generator as rand

randpage :

rand returns a single uniformly distributed random number

所以 rand 服从均匀分布。我的 C++ 代码基于:

std::random_device rd;
std::mt19937 g(rd());
std::shuffle(... , ... ,g);

我的问题是:上面的代码服从均匀分布?如果没有,怎么办?

最佳答案

来自 C++ random number library 的不同类别大致工作如下:

  • std::random_device是一个均匀分布随机数生成器,它可以访问您系统中的硬件设备,或者类似于 Linux 上的 /dev/random。它通常只用于为伪随机生成器提供种子,因为底层设备通常会很快耗尽熵。
  • std::mt19937是一个使用 Mersenne Twister engine 的快速伪随机数生成器其中,根据原作者的论文标题,也是统一的。这会生成完全随机的 32 位或 64 位无符号整数。由于 std::random_device 仅用于为该生成器提供种子,因此它本身不必是统一的(例如,您经常使用当前时间戳为生成器提供种子,这绝对不是均匀分布的)。
  • 通常,您使用 std::mt19937 等生成器来提供特定的分布,例如一个std::uniform_int_distributionstd::normal_distribution然后采用所需的分布形状。
  • std::shuffle ,根据文档,

    Reorders the elements in the given range [first, last) such that each possible permutation of those elements has equal probability of appearance.

在您的代码示例中,您使用 std::mt19937 PRNG 来提供 std::shuffle。因此,std::mt19937 是统一的,std::shuffle 也应该表现统一。因此,一切都尽可能统一。

关于c++ - std::random_device 和 std::mt19937 服从均匀分布吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38367976/

相关文章:

Matlab:从每列中获取不带零的随机值

c++ - 如何告诉我的 Eclipse Helios CTD 项目是 C/C++ 项目?

C++随机数游戏从集合中,rand选择一个不从集合中的数字

android - 如何在 cocos2d x for Android 中检测设备方向变化

matlab - 通过Matlab中的AdaboostM1进行高功能选择,以降低计算复杂性

matlab - Matlab 错误 : Subscripted assignment dimension mismatch

java - 使用 java 中的 VLfeat 库编译 Matlab 代码

c++ - 随机排列

c++ - 降低时间复杂度

c++ - 代码计算故障排除c++