3

我想生成两个彼此不同的随机数。例如,如果第一个随机数生成 5,我希望生成的下一个随机数不等于 5。这是我到目前为止的代码:

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

如何告诉 getRandNum2 不等于 getRandNum1 中生成的值?

4

2 回答 2

14

有一个循环:

int getRanNum2 = ran.Next(10);
while(getRanNum2 == getRanNum1)
    getRanNum2 = ran.Next(10);
于 2013-10-25T22:37:55.187 回答
6

虽然循环检查方法在这里可能很合适,但这个问题的一个变体是“如何在一个范围(或集合)中获得 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,仅交换一次(尽管它可以与自身交换)。无论如何,这留给读者作为练习。

于 2013-10-25T22:48:49.473 回答