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
rand()
。现在,如果我不是那么简单,每次我需要它时,我都必须重新学习它是如何工作的,那就好了,自己设计一些函数,并在项目之间重用它们。比如,一个创建、播种并返回mt19937,另一个将mt19937与两个浮点数一起随机拾取一个浮点数。