我正在尝试用 C++ 转换这行 matlab:rp = randperm(p);
遵循 randperm
documentation :
randperm uses the same random number generator as rand
在 rand
中 page :
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_distribution
或std::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/