2012-01-26 46 views
2

我在寫一個將生成1和6之間的無符號整數(包含邊界)的方法。我現在的方法如下。生成隨機整數時無法包含上限

 private static Random random = new Random(); 
     ... 
     private static uint GetRandomChannel() 
     { 
      return Convert.ToUInt32(random.Next(1, 6)); 
     } 

我碰到這種方法一千次,我也得到數字1到5,但從來沒有得到6.爲什麼會出現這種情況以及如何解決呢?

回答

8

random.Next()的第二個參數是專有的上限。

參數

minValue(最小值):所包含的最低隨機數退還。

maxValue:返回的隨機數的唯一上限。 maxValue必須 大於或等於minValue

返回值

一個32位帶符號整數大於或等於minValue(最小值)和小於包括maxValue;也就是說,返回值的範圍包括minValue但不包括maxValue。如果minValue等於maxValue,minValue被返回。

這意味着random.Next(1, 6)只會範圍1 <= n < 6返回值n。因此,對於您的模具軋製模擬

,你將需要使用

random.Next(1, 7) 

注意:這個API的設計是奇數。它有minValue == maxValue的特殊情況處理,這似乎不必要地使API複雜化。如果我設計了這個API,我會讓這兩個參數成爲包含的限制。這會產生令人滿意的對稱性,並允許隨機數字覆蓋整個範圍int

+0

更令人失望的是,我一再呼籲random.Next(n,n + 1),結果似乎不是隨機的! –

+0

@SeanU它是完全隨機的!唯一與真正的RNG無法區分的僞RNG! ;-) –

1

你不能「修復」這一點;這只是什麼this method意味着做:

的32位有符號整數大於或等於零,並且小於 MaxValue的。

所以如果你想在[a,b]中產生一個隨機整數,你需要使用.Next(a, 1 + b)

2

根據MSDN文檔here,該random.Next函數返回一個值嚴格小於MaxValue(6你的情況)。

1

根據method documentation,下限是包容性的,上限是排他性的。這意味着random.Next(lower,upper)將返回較低的數字,但保證永遠不會返回較高的數字。