【发布时间】:2016-11-17 00:04:45
【问题描述】:
我正在尝试在 C++ 中转换这行 matlab:rp = randperm(p);
关注randpermdocumentation:
randperm 使用与 rand 相同的随机数生成器
在randpage:
rand 返回单个均匀分布的随机数
所以rand 遵循均匀分布。我的 C++ 代码基于:
std::random_device rd;
std::mt19937 g(rd());
std::shuffle(... , ... ,g);
我的问题是:上面的代码遵循均匀分布?如果没有,怎么办?
【问题讨论】:
-
至少
std::mt19937应该是统一的,if you trust the original authors' paper title。而std::random_device只是用来播种 Mersenne Twister,所以它实际上不必以任何方式保持一致。 -
@mindriot 感谢您的回答。和上面描述的
std::uniform_int_distribution相比有什么区别? -
mt19937是一个随机数 engine,它产生“原始”随机数(32 位或 64 位),并且这些随机数应尽可能统一。uniform_int_distribution将随机输入转化为与特定分布匹配的东西(例如,在 {1, ..., 6} 上均匀分布)。 -
shuffle在内部构造自己的分布,它只需要一个随机源:引擎。mt19937是标准库中最好的。
标签: c++ matlab random uniform-distribution