我想生成两个彼此不同的随机数。例如,如果第一个随机数生成5,我希望生成的下一个随机数不等于5.这是我的代码到目前为止:
Random ran = new Random();
int getRanNum1 = ran.Next(10);
int getRanNum2 = ran.Next(10);
如何告诉getRandNum2不等于getRandNum1中生成的值?
答案 0 :(得分:13)
循环:
int getRanNum2 = ran.Next(10);
while(getRanNum2 == getRanNum1)
getRanNum2 = ran.Next(10);
答案 1 :(得分: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
,只交换一次(虽然它可以与自己交换)。在任何情况下,这都留给读者练习。