<random>拥有大量的发动机和配送选项.这很好,但是我阅读的大多数文档都同等重视每个引擎和发行版,并且没有为某些用例建议使用或有用的实例.我通常只是用来rand()快速获取有用的数据,但我正在努力成为一名更好的C++程序员!(另外,rand()在某个范围内获得有用的浮子可能会有时会让自己头痛)
我的问题是,在C++中实例化一个随机数生成器的最快最懒的方法是什么,它会在[0 ... n]范围内做随机数(浮点数,选择一个类型)而没有任何奇怪的惊喜?
编辑:
观看评论中提到的随机演示文稿,我意识到我需要的引擎和分发是mt199937和uniform_real_distribution.我不确定哪个是mersenne twister,但看到'mt'现在很明显了.结合这两个概念现在也有意义.以下是我正在使用的其他人遇到的情况:
std::mt19937 randomEngine(seed);
std::uniform_real_distribution<float> range(0, n);
float randomResult = range(randomEngine);
Run Code Online (Sandbox Code Playgroud)
观看Stephan T. Lavavej的谈话rand()被认为是有害的,它会回答你所有的问题等等.
特别是:
要生成0到n之间的均匀随机数,请使用
std::random_device dev;
std::mt19937 gen{dev()};
std::uniform_real_distribution<T> dist{0, n};
Run Code Online (Sandbox Code Playgroud)
这使用预定义的mt19937引擎,这是一个很好的默认值,应该在没有强反对的所有情况下使用.
对于播种,std::random_device除非您需要可重复的种子,否则请使用.
千万不能使用std::default_random_engine,因为它是根据指定的:有超过它使用什么引擎无法控制,它是不可移植.
要重新排列一系列元素,请使用std::shuffle,不要再使用std::random_shuffle,请考虑将其弃用.