生成2个不同C#的随机数

时间:2013-10-25 22:36:32

标签: c#

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

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

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

2 个答案:

答案 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,只交换一次(虽然它可以与自己交换)。在任何情况下,这都留给读者练习。