我想生成兩個彼此不同的隨機數。例如,如果第一個隨機數生成5,我想產生不等於5。這是我的代碼迄今的下一個隨機數:生成2個不同的隨機數C#
Random ran = new Random();
int getRanNum1 = ran.Next(10);
int getRanNum2 = ran.Next(10);
我如何告訴getRandNum2在getRandNum1不產生相等的值?
我想生成兩個彼此不同的隨機數。例如,如果第一個隨機數生成5,我想產生不等於5。這是我的代碼迄今的下一個隨機數:生成2個不同的隨機數C#
Random ran = new Random();
int getRanNum1 = ran.Next(10);
int getRanNum2 = ran.Next(10);
我如何告訴getRandNum2在getRandNum1不產生相等的值?
有了一個循環:
int getRanNum2 = ran.Next(10);
while(getRanNum2 == getRanNum1)
getRanNum2 = ran.Next(10);
雖然環和檢查方法可能適合這裏,這個問題的一個變種是「如何在一個範圍內獲得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
,只交換一次(雖然它可以與自己交換)。無論如何,這留給了讀者一個練習。
你確實意識到這使'getRanNum2'稍微不隨機?特別是在像'0..9'這樣的小範圍內。 –