繁体   English   中英

C ++随机数生成,[0…n]的范围,尽可能快而懒惰?

[英]C++ random number generation, range of [0…n], as quick and lazy as possible?

<random>具有大量的引擎和分发选项。 一切都很好,但是我所阅读的大多数文档都对每个引擎和发行版都给予了同等的关注,并且没有为某些用例建议使用或有用的实例。 我通常只是使用rand()快速获取有用的数据,但是我正在努力成为一个更好的C ++程序员! (另外,有时有用的浮点数会超出rand()可能是自己的头痛)

我的问题是,用C ++实例化随机数生成器的最快,最懒惰的方法是什么,它将生成[0 ... n]范围内的随机数(浮点数,以选择类型)而没有任何奇怪的惊喜?

编辑:

看着在评论中提到随机演示,我意识到我需要发动机和分布mt199937uniform_real_distribution 我不确定哪是梅森捻线机,但是看到“ mt”现在很明显了。 将这两个概念结合起来现在也很有意义。 这是我正在使用的,以防其他任何人遇到此问题:

std::mt19937 randomEngine(seed);
std::uniform_real_distribution<float> range(0, n);

float randomResult = range(randomEngine);

观看Stephan T. Lavavej的讲话rand()被认为是有害的 ,它将回答您的所有问题以及更多问题。

尤其是:

  • 要生成介于0和n之间的统一随机数,请使用

     std::random_device dev; std::mt19937 gen{dev()}; std::uniform_real_distribution<T> dist{0, n}; 

    这使用了预定义的mt19937引擎,这是一个很好的默认值,并且在没有强烈反对的情况下都应使用。

    对于种子,请使用std::random_device除非您需要可复制的种子。

  • 不要使用std::default_random_engine有超过它使用什么引擎无法控制,它是不可移植的:因为它是根据指定的。

  • 要随机播放元素序列,请使用std::shuffle ,不要使用std::random_shuffle ,请考虑将其弃用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM