我想生成两个彼此不同的随机数。例如,如果第一个随机数生成 5,我希望生成的下一个随机数不等于 5。这是我到目前为止的代码:
Random ran = new Random();
int getRanNum1 = ran.Next(10);
int getRanNum2 = ran.Next(10);
如何告诉 getRandNum2 不等于 getRandNum1 中生成的值?
我想生成两个彼此不同的随机数。例如,如果第一个随机数生成 5,我希望生成的下一个随机数不等于 5。这是我到目前为止的代码:
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 个不同的随机数?”
为此,一种可能的选择(也是我喜欢的一种,这就是我写这个答案的原因)是建立所说的范围(或集合),洗牌items,然后取前 N 个项目。
Fischer-Yates shuffle 的实现可以在这个答案中找到。稍微清理一下情况:
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
,仅交换一次(尽管它可以与自身交换)。无论如何,这留给读者作为练习。