我正在研究一種需要儘可能快地生成數百萬個數字的算法。實際上我發現我的算法的rand()函數佔用了75%的處理時間。比rand()更快?
所以我正在尋找更快的東西。而且我根本不需要很大的範圍。 (我只需要低於1000的整數)
你知道我可以使用的東西嗎?
謝謝!
編輯:
我使用這個數字來混洗少於1000個實體的組。
我發現更多關於「快速蘭特」。還有更快的SSE版本版本,一次生成4個數字。
我正在研究一種需要儘可能快地生成數百萬個數字的算法。實際上我發現我的算法的rand()函數佔用了75%的處理時間。比rand()更快?
所以我正在尋找更快的東西。而且我根本不需要很大的範圍。 (我只需要低於1000的整數)
你知道我可以使用的東西嗎?
謝謝!
編輯:
我使用這個數字來混洗少於1000個實體的組。
我發現更多關於「快速蘭特」。還有更快的SSE版本版本,一次生成4個數字。
static unsigned int g_seed;
// Used to seed the generator.
inline void fast_srand(int seed) {
g_seed = seed;
}
// Compute a pseudorandom integer.
// Output value in range [0, 32767]
inline int fast_rand(void) {
g_seed = (214013*g_seed+2531011);
return (g_seed>>16)&0x7FFF;
}
你從哪裏得知它比Kevin的機器具有的'rand()'實現更快? – 2014-10-07 13:58:07
我剛剛測試過它:1億1千萬個數字需要1.2s,rand()需要5s。 我將不得不檢查它是否真的是隨機的,但謝謝! – 2014-10-07 14:06:12
它比rand()更快一些。有一些角落案件,但沒有那麼重要。 @JensGustedt和我的榮幸kevinP – Asis 2014-10-07 14:16:19
Mersenne Twister算法是一個相當快而不失平衡的僞隨機數發生器。
在大多數系統中,rand()是一個僞隨機數生成器。我想知道他的實現實際上有多慢。 – 2014-10-07 13:43:52
我想他們並沒有改變默認實現,因爲它會破壞預先播種的軟件...... – blue112 2014-10-07 13:46:18
在大多數系統中,蘭特()是一個僞隨機數發生器。因此,代碼應該只是一些移位+位或操作,並且能夠在典型的PC上每秒產生數百萬個數字。你不會說你得到了什麼,你的硬件是什麼,或者你正在使用哪個C庫,所以很難看出你的實現爲什麼「很慢」。也許你可以嘗試重用位:取最低的10位(= 1024個值),以1000爲模取得你想要的數字範圍。然後移位,當你用盡比特時,再次撥打rand()
獲取更多比特。
我不確定這是否是一個好主意,重新使用位可能不能保證最可能的線性他正在使用的全等方法。 – 2014-10-07 13:51:04
如果您正在使用英特爾Ivy Bridge處理器,可以很好地使用RDRAND指令卸載隨機數生成硬件。
這stack overflow article談論RDRAND的吞吐量。
您還可以確定處理器是否支持RDRAND並使用硬件卸載或者回退到軟件實現。
3秒的75%並不多。通常,'rand()'非常快。您的代碼需要多長時間才能創建100萬個數字? – 2014-10-07 13:42:20
不要認爲75%是「慢」。畢竟,即使運行在納秒,*東西*將佔用100%的時間。如果程序主要除了生成隨機數字之外什麼都不做,你會期望佔用大部分時間。但是,如果您希望速度更快,那會告訴您在哪裏尋找。 – 2014-10-07 13:47:02
我並不是說它「很慢」,但如果我想改進我的算法,這可能是我應該開始的地方。 – 2014-10-07 13:50:27