[英]C++ random number generation, range of [0…n], as quick and lazy as possible?
<random>
具有大量的引擎和分發選項。 一切都很好,但是我所閱讀的大多數文檔都對每個引擎和發行版都給予了同等的關注,並且沒有為某些用例建議使用或有用的實例。 我通常只是使用rand()
快速獲取有用的數據,但是我正在努力成為一個更好的C ++程序員! (另外,有時有用的浮點數會超出rand()
可能是自己的頭痛)
我的問題是,用C ++實例化隨機數生成器的最快,最懶惰的方法是什么,它將生成[0 ... n]范圍內的隨機數(浮點數,以選擇類型)而沒有任何奇怪的驚喜?
編輯:
看着在評論中提到隨機演示,我意識到我需要發動機和分布mt199937
和uniform_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.