我正在尝试用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);
我的问题是:上面的代码遵循统一分布?如果没有,该怎么做?
答案 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_distribution
或std::normal_distribution
然后采用所需的分布形状。std::shuffle
,根据文件,
重新排列给定范围
[first, last)
中的元素,使得这些元素的每个可能的排列具有相同的出现概率。
在您的代码示例中,您使用std::mt19937
PRNG来提供std::shuffle
。因此,std::mt19937
是统一的,std::shuffle
也应该统一。所以,一切都尽可能一致。