std :: random_device和std :: mt19937是否遵循统一分布?

时间:2016-07-14 07:23:21

标签: c++ matlab random uniform-distribution

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

关注randperm documentation

  

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

rand page

  

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

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

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

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

1 个答案:

答案 0 :(得分:6)

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,根据文件,
      

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

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