4

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

按照randperm 文档

randperm 使用与 rand 相同的随机数生成器

rand 页面中:

rand 返回单个均匀分布的随机数

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

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

我的问题是:上面的代码遵循均匀分布?如果没有,该怎么做?

4

1 回答 1

13

C++ 随机数库中的不同类大致如下工作:

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

    对给定范围内的元素重新排序,以使[first, last)这些元素的每个可能排列具有相同的出现概率。

在您的代码示例中,您使用std::mt19937PRNG 来提供std::shuffle. 所以,std::mt19937是统一的,也std::shuffle应该是统一的。所以,一切都尽可能统一。

于 2016-07-14T07:58:52.807 回答