2014-10-07 60 views
3

我正在研究一種需要儘可能快地生成數百萬個數字的算法。實際上我發現我的算法的rand()函數佔用了75%的處理時間。比rand()更快?

所以我正在尋找更快的東西。而且我根本不需要很大的範圍。 (我只需要低於1000的整數)

你知道我可以使用的東西嗎?

謝謝!

編輯:

我使用這個數字來混洗少於1000個實體的組。

我發現更多關於「快速蘭特」。還有更快的SSE版本版本,一次生成4個數字。

https://software.intel.com/en-us/articles/fast-random-number-generator-on-the-intel-pentiumr-4-processor/

+0

3秒的75%並不多。通常,'rand()'非常快。您的代碼需要多長時間才能創建100萬個數字? – 2014-10-07 13:42:20

+1

不要認爲75%是「慢」。畢竟,即使運行在納秒,*東西*將佔用100%的時間。如果程序主要除了生成隨機數字之外什麼都不做,你會期望佔用大部分時間。但是,如果您希望速度更快,那會告訴您在哪裏尋找。 – 2014-10-07 13:47:02

+0

我並不是說它「很慢」,但如果我想改進我的算法,這可能是我應該開始的地方。 – 2014-10-07 13:50:27

回答

3
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; 
} 
+1

你從哪裏得知它比Kevin的機器具有的'rand()'實現更快? – 2014-10-07 13:58:07

+0

我剛剛測試過它:1億1千萬個數字需要1.2s,rand()需要5s。 我將不得不檢查它是否真的是隨機的,但謝謝! – 2014-10-07 14:06:12

+0

它比rand()更快一些。有一些角落案件,但沒有那麼重要。 @JensGustedt和我的榮幸kevinP – Asis 2014-10-07 14:16:19

4

Mersenne Twister算法是一個相當快而不失平衡的僞隨機數發生器。

下面是一個示例實現:http://fmg-www.cs.ucla.edu/geoff/mtwist.html

+0

在大多數系統中,rand()是一個僞隨機數生成器。我想知道他的實現實際上有多慢。 – 2014-10-07 13:43:52

+0

我想他們並沒有改變默認實現,因爲它會破壞預先播種的軟件...... – blue112 2014-10-07 13:46:18

2

在大多數系統中,蘭特()是一個僞隨機數發生器。因此,代碼應該只是一些移位+位或操作,並且能夠在典型的PC上每秒產生數百萬個數字。你不會說你得到了什麼,你的硬件是什麼,或者你正在使用哪個C庫,所以很難看出你的實現爲什麼「很慢」。也許你可以嘗試重用位:取最低的10位(= 1024個值),以1000爲模取得你想要的數字範圍。然後移位,當你用盡比特時,再次撥打rand()獲取更多比特。

+1

我不確定這是否是一個好主意,重新使用位可能不能保證最可能的線性他正在使用的全等方法。 – 2014-10-07 13:51:04

2

如果您正在使用英特爾Ivy Bridge處理器,可以很好地使用RDRAND指令卸載隨機數生成硬件。

stack overflow article談論RDRAND的吞吐量。

您還可以確定處理器是否支持RDRAND並使用硬件卸載或者回退到軟件實現。