2011-02-28 108 views
3

我應該如何生成一個介於0到2之間的隨機數?我應該如何生成0到2之間的隨機數? BCL隨機不是隨機的

我目前正在使用一個私有靜態只讀隨機對象,並調用_random.Next(0,2)但值不是隨機的...我看到序列0,0,0,1,1,0,0 ,0,,1,1,1

下面顯然不是隨機的。我應該怎麼做?

非常感謝

+2

看起來隨機給我..... – 2011-02-28 11:45:35

+4

請解釋你爲什麼認爲它不是隨機的..... – 2011-02-28 11:46:56

+1

這可能源於誤解什麼是隨機的。我懷疑他/她希望它更統一。但好吧,它不是隨機的,只是僞隨機:) – Skurmedel 2011-02-28 11:47:40

回答

10

如果你的意思是你想隨機數0或1,那麼你在做什麼已經是正確的。

如果你想要數字0,1或2,那麼你需要寫_random.Next(0, 3)

1

如果使用相同的種子初始化Random,您將得到相同的數字序列。這就是爲什麼它可能是一個好主意,使用基於時間的種子:

Random _random = new Random(DateTime.UtcNow.Millisecond); 

另外,還要注意在Next上限是獨家。這意味着Next(0, 2)將總是隻返回0或1(但這可能是你想要的;對於我來說這個問題有點不清楚)。

+0

默認構造函數使用基於時間的種子。不知道什麼時間分辨率。另外,如果'DateTime。UtcNow.Milliseconds'就像Win32定時函數一樣,它可能沒有你想象的那麼多的分辨率,這在創建多個Random的實例時可能是個問題。 – 2011-02-28 12:01:06

+0

@Merilyn:關於DateTime.UtcNow.Millisecond的解決方案,我不確定它(即使在我的機器上,它似乎實際上解決了每毫秒,有點令人驚訝的是,我期望看到每個15毫秒左右的地方或所以);我只用它作爲基於時間的種子的一個簡單例子。 – 2011-02-28 12:12:48

3

您已經在以正確的方式進行操作(只要您對僞隨機數的要求不包括加密安全性)。

問題是隨機性在統計上是確定的(使用數學),不直觀地確定(使用你的眼睛)。

例如,即使您的隨機數序列是一致隨機的,給定了一個無限序列的隨機數,您仍然可以看到連續數十萬個1。

this Wikipedia article on Pseudorandom Number Generators

如果你試圖讓數字「0,1,2」,那麼你可能需要您的來電更改爲random.Next(0, 3)。如果你確實只想要0和1,那麼保持原樣。另外,如果您在代碼的多個位置創建Random的實例,則可能會得到相同的種子,因此會得到相同的隨機數序列。避免這種情況的一種方法是在這兩段代碼之間重用Random類的實例,而不是創建新實例。

1

maxValue是「包含和不包含」。如果你想包括2,只需寫_random.Next(0,3)