C++随机数生成,范围[0 ... n],尽可能快速和懒惰?

Ann*_*inn 2 c++ random

<random>拥有大量的发动机和配送选项.这很好,但是我阅读的大多数文档都同等重视每个引擎和发行版,并且没有为某些用例建议使用或有用的实例.我通常只是用来rand()快速获取有用的数据,但我正在努力成为一名更好的C++程序员!(另外,rand()在某个范围内获得有用的浮子可能会有时会让自己头痛)

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

编辑:

观看评论中提到的随机演示文稿,我意识到我需要的引擎和分发是mt199937uniform_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)

Kon*_*lph 5

观看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,请考虑将其弃用.