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

jip*_*pot 3 c#

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

Random ran = new Random();
int getRanNum1 = ran.Next(10);
int getRanNum2 = ran.Next(10);
Run Code Online (Sandbox Code Playgroud)

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

Tim*_*ter 14

循环:

int getRanNum2 = ran.Next(10);
while(getRanNum2 == getRanNum1)
    getRanNum2 = ran.Next(10);
Run Code Online (Sandbox Code Playgroud)


use*_*740 5

虽然循环检查方法在这里可能是合适的,但这个问题的变体是"如何在范围(或集合)中获得N个不同的随机数?"

为此,一个可能的替代方案(我喜欢的一个,这就是我写这个答案的原因)是建立所述范围(或集合),洗牌项目,然后取前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];
Run Code Online (Sandbox Code Playgroud)

由于我们知道只选择 N(2)个元素Shuffle,因此实际上可以修改上述方法,使得仅完成N(2)个交换.这是因为arr[i - 1],对于每一个i,只交换一次(虽然它可以与自己交换).在任何情况下,这都留给读者练习.