2013-10-25 56 views
2

我想生成兩個彼此不同的隨機數。例如,如果第一個隨機數生成5,我想產生不等於5。這是我的代碼迄今的下一個隨機數:生成2個不同的隨機數C#

Random ran = new Random(); 
int getRanNum1 = ran.Next(10); 
int getRanNum2 = ran.Next(10); 

我如何告訴getRandNum2在getRandNum1不產生相等的值?

+3

你確實意識到這使'getRanNum2'稍微不隨機?特別是在像'0..9'這樣的小範圍內。 –

回答

13

有了一個循環:

int getRanNum2 = ran.Next(10); 
while(getRanNum2 == getRanNum1) 
    getRanNum2 = ran.Next(10); 
5

雖然環和檢查方法可能適合這裏,這個問題的一個變種是「如何在一個範圍內獲得N個不同的隨機數(或設置)? 「因此,一種可能的替代方案(我喜歡的一種方法,這就是我寫這個答案的原因)是構建所述範圍(或集合)shuffle the items,然後取前N個項目。

Fischer-Yates shuffle的實現可以找到in this answer。略清理的情況:

void Shuffle (int arr[]) { 
    Random rnd = new Random(); 
    for (int i = arr.Length; i > 1; i--) { 
    int pos = rnd.Next(i); 
    var x = arr[i - 1]; 
    arr[i - 1] = arr[pos]; 
    arr[pos] = x; 
    } 
} 

// usage 
var numbers = Enumerable.Range(0,10).ToArray(); 
Shuffle(numbers); 
int getRanNum1 = numbers[0]; 
int getRanNum2 = numbers[1]; 

由於我們知道僅 N(2)被選擇的元素,上述Shuffle方法實際上可以被修改,使得只有N(2)交換被完成。這是因爲arr[i - 1],每個i,只交換一次(雖然它可以與自己交換)。無論如何,這留給了讀者一個練習。