2014-09-25 28 views
0

我需要生成大量隨機數,它們必須位於1和int.MaxValue之間的任意位置。傳遞給Random類的Next方法的參數並不總是相同的。在一個塞納里奧參數可能如下:下一個方法(.NET Framework)的隨機數問題

Next(1, int.MaxValue); 

在另一個,他們很可能會成爲:

Next(1, 2); 

這裏的問題是,只要你通過值像1和2或99和100,較低的數字始終是該方法返回的「隨機」數字。原因是因爲該方法從最大值中減去1(除非最小值和最大值相同),然後給出隨機數。如上所述,我將如何在一系列數字範圍內生成一系列隨機數字,而不會得到這種可預測的結果?

回答

6

您將需要通過包容性的上限+ 1,即:

var result = rand.Next(1, 2+1); // Returns 1 or 2 
var result2 = rand.Next(99, 101); // Returns 99 or 100 

請注意,這不會對int.MaxValue工作,當然。 Random沒有辦法直接返回int.MaxValue。要獲得[0,int.MaxValue]結果,您需要執行以下操作:

var result = rand.Next(-1, int.MaxValue) + 1; 
+3

我不認爲.NET想int.MaxValue + 1 – goodbyeworld 2014-09-25 20:07:09

+0

@goodbyeworld好點 - 編輯以包括。 – 2014-09-25 20:20:39

4

上限是排他性的,不包括在內。鑑於此,範圍[1,2]僅包含一個數字,1,而不是兩個。

1

the documentation,到Next(int, int)第一個參數是「的包容下界」,而第二個是「獨家上限」。

如果你想生成,可能是12,你應該使用下面的調用一個隨機數:

rand.Next(1, 3) 
0

怎麼樣取下限和上限,並給你一個方法,你」重新找?

實施例:

public int GetRandom(int lower, int upper) 
    { 
     return upper == int.MaxValue ? rand.Next(lower - 1, upper) + 1 : rand.Next(lower, upper + 1); 
    } 

如果上限爲int.MaxValue,它由1移動的範圍下,然後添加回它給所述隨機數後。否則,它將上限加1,然後給你隨機數。

然後,當你使用它,你只是這樣做:

var randomOne = GetRandom(1, 2); 
    var randomTwo = GetRandom(99,int.MaxValue); 
0

試試這個

using System; 

namespace ConsoleApplication3 
{ 
    class Program 
    { 
    static readonly Random r = new Random(); 
    static void Main(string[] args) 
    { 
     for (int i = 2; i <= 100; i++) 
     { 
      Console.WriteLine(GetRandom(i)); 
     } 
    } 

    private static int GetRandom(int i) 
    { 
     return 1 + (r.Next(int.MaxValue)%i); 
    } 
    } 
} 

乾杯。

0

您可以通過獲取隨機int後加入1得到int.MaxValue

var result = rand.Next(1, int.MaxValue) + 1; 
+0

這樣做,你永遠不會得到下界。 – Kaz 2014-09-25 20:13:10

+0

下限可以設置爲小於實際下限1。 – Shaharyar 2014-09-25 20:15:43

+0

你所做的所有事情都是從加1到上減1 ...... – Kaz 2014-09-25 20:19:09