2009-11-24 311 views
9

如何在C#中使用maxValue(和/或minValue)支持填充字節數組的快速RNG(隨機數生成器)? 我找到了這個http://www.codeproject.com/KB/cs/fastrandom.aspx,但沒有這些功能。快速隨機生成器

+10

System.Random是否太慢? – driis 2009-11-24 15:26:58

+0

它可能很好。他正在填充字節,這是一個非常特殊的情況。旨在填充字節的代碼可能會快一個數量級或更多。他需要那個速度嗎?我不知道。 – Nosredna 2009-11-24 15:49:41

+4

是的,System.Random太慢了。我有許多隨機數字來生成。 – tazzo 2009-11-24 22:41:29

回答

23

,你填個字節的整數的事實就足以從不同System.Random的典型用例,如果您真的需要,您可能會很糟糕。

System.Random是爲一般用途而製作的。 (實際上,當我對它們進行速度和分配測試時,我通常會發現系統隨機例程不夠靈敏。)有些情況下,您需要其他東西。但是你必須對你的需求非常明確。多快?你願意放棄什麼?

如果您真的需要「快速」,Marsaglia已經生成了很多非常快速的隨機數生成器,可以根據您的需要進行調整。下面是關於他們的一個幾個環節,Xorshift:

最後一個解決了你指定字節的事實。

我只需要幾次超快的隨機數。在慢速處理器的控制檯遊戲中,隨機可以使命中幀速率目標而不是命中目標。你的用例是什麼?通過一切手段,如果可以的話,使用System.Random。

或者,修改您在問題中鏈接到的例程(作者聲稱這是System.Random速度的8倍。)

+0

這最後一個環節是相當有趣的研究,+1 – 2009-11-24 15:59:25

+0

謝謝您的回答,RNG必須儘可能快速地,我有很多很多的隨機數在幾秒鐘內生成(10^9以上)。 我試圖在我的鏈接中修改常規,但我沒有成功,你能幫我嗎? – tazzo 2009-11-24 22:54:32

+0

有很多可能性。想象一下,你已經爲範圍設置了一個4k的隨機數緩衝區(比如0-100)。使用隨機數生成器來選擇偏移量並抓取,例如從列表中選擇16個字節。然後生成另一個偏移量並獲取另外16個字節。這不會是_fantastically_ random,但它可能是_lyfficiently_ random。儘管我問了,但你沒有告訴我你願意放棄什麼來獲得速度。用這些數字你會做什麼? – Nosredna 2009-11-25 00:38:00

-3

您可以使用ReflectorSystem.Random反編譯爲C#。這會給你一個滿足你需求的快速隨機數生成器的C#代碼。

+3

實際上,不...框架是預編譯和優化的,你不能與之競爭(直到你還預編譯你的代碼)。至少這是我所做的經驗(當試圖超出框架時))。 – Bobby 2009-11-24 15:37:32

+3

爲什麼他會那樣做?據推測,自從他問道,隨機性太慢了,否則他會用這個,不是嗎? – 2009-11-24 15:39:14

+0

@Bobby:令人沮喪,真實。不過,預編譯自己的代碼無濟於事。 – 2009-11-24 15:40:06

12

System.Random對於任何典型用途都足夠快。如果您在使用包含System.Random調用的代碼時遇到性能問題,請確保在嘗試構建新的隨機程序之前在之前對代碼進行概要分析。機會是你的性能問題不在框架中,而是在你自己的代碼中。

如果您在循環中調用Random,請確保您沒有爲每次迭代創建新的Random實例,而是重新使用常見的Random實例。這樣做可以提高性能,因爲您不會爲GC進行清理創建新對象,並且還會提高生成的隨機數的質量。

+0

我的代碼只在幾秒鐘內 – tazzo 2009-11-24 22:42:55

+22

產生很多很多的隨機數,它是驚人的多少SO答案決定爭論提問者的需求,而不是回答這個問題的。 – Nosredna 2009-11-25 00:40:21

+1

@tazzo:有多少?你所追求的具體要求是什麼? @Nosredna:有時候回答這個問題,幫助提問者是兩回事。誰在爭論? – 2009-11-25 13:46:49

-1

使用加密服務....

RNGCryptoServiceProvider crypto = new RNGCryptoServiceProvider(); 
byte[] bytes= new byte[5]; 
crypto.GetBytes(bytes); 
當然

,這隻能滿足字節區域需求...

+5

我沒有超時它自己,但我猜想,RNGCryptoServiceProvider,具有被加密安全的額外的屬性,會比System.Random慢。 – SoftMemes 2009-11-24 15:40:36

+0

我檢查過RNGCryptoServiceProvider,但不符合我的需求,是減慢並且不要讓最大值產生隨機數。 – tazzo 2009-11-24 22:55:21

0

如果您有一個隨機數生成器從單位時間間隔返回數字,就像您提到的代碼項目文章中的那個一樣,那麼您可以首先使用該生成器生成一個值u,然後返回a + (b-a)*u以在a和b。

+0

如果我選擇A = 5和B = 20,U = 55,我的公式是不正確的,我得到5+(20-5)* 55 = 830。 正確的公式是U /(UMAX + 1)*(B-A)+ A其中UMAX是隨機數的最大值。 – tazzo 2009-11-26 14:39:24

+1

如果隨機值u來自*單位間隔*,即介於0和1之間,那麼公式是正確的。在你的例子中,u = 55不是0到1之間的數字。 – 2009-11-28 14:11:33