是否遵循均匀分布::random_device 和 std::mt19937

Do std::random_device and std::mt19937 follow an uniform distribution?

本文关键字:device std mt19937 random 是否 分布      更新时间:2023-10-16

我正在尝试用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_distributionstd::normal_distribution,然后采用所需的分布形状。
  • std::shuffle,根据文件,

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

在代码示例中,您使用 std::mt19937 PRNG 馈送std::shuffle 。 所以,std::mt19937是统一的,std::shuffle也应该表现得统一。 所以,一切都尽可能统一。