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

C# 生成2个不同于C的随机数#,c#,C#,我想生成两个彼此不同的随机数。例如,如果第一个随机数生成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 == getRanNum

我想生成两个彼此不同的随机数。例如,如果第一个随机数生成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个不同的随机数?”

为此,一个可能的替代方案(我喜欢,这就是我为什么写这个答案的原因)是建立所述范围(或集合),然后取前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
,只能交换一次(尽管它可以与自身交换)。在任何情况下,这留给读者作为练习。

您是否意识到这会使
getRanNum2
的随机性降低一点?特别是在小范围内,如
0..9