C++ C++;随机数生成,范围为[0…n],是否尽可能快和慢?

C++ C++;随机数生成,范围为[0…n],是否尽可能快和慢?,c++,random,C++,Random,有大量的发动机和分配选项。这是很好的,但我读过的大多数文档都对每个引擎和发行版给予了同等的关注,并且没有为某些用例提供使用建议或有用的实例。我通常只使用 RAND()/Cord>快速获取有用的数据,但我正在努力成为一个更好的C++程序员!(另外,从rand()特定范围内获得有用的浮动有时可能会让它自己头疼) 我的问题是,C++中的随机数生成器最快最懒的方法是在随机数(浮标,选择一种类型)的范围内(0…n)没有任何奇怪的惊喜?< /P> 编辑: 观看评论中提到的随机演示,我意识到我需要的引擎和分发

有大量的发动机和分配选项。这是很好的,但我读过的大多数文档都对每个引擎和发行版给予了同等的关注,并且没有为某些用例提供使用建议或有用的实例。我通常只使用<代码> RAND()/Cord>快速获取有用的数据,但我正在努力成为一个更好的C++程序员!(另外,从
rand()
特定范围内获得有用的浮动有时可能会让它自己头疼)

我的问题是,C++中的随机数生成器最快最懒的方法是在随机数(浮标,选择一种类型)的范围内(0…n)没有任何奇怪的惊喜?< /P> 编辑:

观看评论中提到的随机演示,我意识到我需要的引擎和分发是
mt199937
uniform\u real\u distribution
。我不确定哪一个是梅森龙卷风,但看到“mt”现在已经很明显了。现在,将这两个概念结合起来也是有意义的。以下是我在其他人遇到这种情况时使用的方法:

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

float randomResult = range(randomEngine);
std::mt19937随机引擎(seed);
标准:均匀实分布范围(0,n);
浮动随机结果=范围(随机引擎);

观看Stephan T.Lavavej的演讲,它将回答您的所有问题和更多问题

特别是:

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

    std::random_device dev;
    std::mt19937 gen{dev()};
    std::uniform_real_distribution<T> dist{0, n};
    
    std::随机设备开发;
    std::mt19937 gen{dev()};
    一致实分布距离{0,n};
    
    这使用了预定义的引擎,这是一个很好的默认值,应该在没有强烈反对它的情况下使用

    对于种子,除非需要可复制的种子,否则请使用

  • 不要使用
    std::default\u random\u engine
    ,因为它未被指定:无法控制它正在使用的引擎,并且不可移植

  • >p>洗去一系列元素,使用,做<强>不/强>使用<代码> STD::RealthyStuffle >,考虑它被贬低。


将告诉你所需的一切:)建议将一些简单的<代码> RAND ——类似于C++的函数,使用<代码> <代码>。您可以复制他们建议的实现之一。“函数模板工具包”看起来就可以了。这并不难,请参见中的示例。只需要三行就可以完成所有的设置,你只需要做一次。@Quentin-啊,我以前看过这个演示。这就是为什么我停止使用
rand()
。现在,如果我不是那么简单,每次我需要它时,我都必须重新学习它是如何工作的,那就好了,自己设计一些函数,并在项目之间重用它们。比如,一个创建、播种并返回mt19937,另一个将mt19937与两个浮点数一起随机拾取一个浮点数。