簡體   English   中英

C++ 快速生成大量隨機浮點數(10,000+ 個數字)

[英]C++ generate large amounts of random floats(10,000+ numbers) fast

對於我目前正在進行的一個項目,我需要盡可能快地生成大量介於 0 和 1 之間的偽隨機浮點數,范圍在數千到數十萬之間。

最好的方法是什么?

目前我能想到的選項有:

C rand() ,根據我的經驗相當快。

C++11 隨機,從我聽說的情況來看,隨機數相當慢但更好。

自定義 hash function 如:

u_int32_t seed = 1;
seed = (seed ^ 61) ^ (seed >> 16);
seed = seed + (seed << 3);
seed = seed ^ (seed >> 4);
seed = seed * 0x27d4eb2d;
seed = seed ^ (seed >> 15);
uint8_t a = seed&0xff;
float n = (((float)a)/UINT8_MAX);

這是相當快的。

上述速度測試:

Generating 100000 Random Numbers
C rand(): 1.72661
C++ random: 6.60626
hash random: 1.034

有更快的選擇嗎? 我唯一能想到的是一些更快的 hash 或以某種方式通過計算着色器在 GPU 上執行此操作,但我在這方面沒有太多經驗。

非常感謝任何幫助。

編輯:澄清一下,以上時間以毫秒為單位。

最好的方法是什么?

取決於速度以外的其他要求。 序列是否需要可重現? 隨機性的統計質量重要嗎? 分布是否需要統一? 您將使用什么處理器來執行程序?

如果速度是唯一的考慮因素,那么最快的解決方案是return 0.0 ,盡管分布相當有偏差。

更嚴重的是,如果統計質量至少有一點點重要,足以使常數值不夠,但仍然遠低於速度,那么選擇生成器的最佳方法是對已知算法進行基准測試並選擇最快的算法在您的目標系統上。 <random>包括一些生成器,其中一些非常簡單和快速。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM