【问题标题】:Generating 2 Random Numbers that are Different C#生成 2 个不同的 C# 随机数
【发布时间】:2013-10-25 22:36:32
【问题描述】:

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

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

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

【问题讨论】:

  • 您确实意识到这会使getRanNum2 不那么随机?尤其是在0..9 这样的小范围内。

标签: c#


【解决方案1】:

有一个循环:

int getRanNum2 = ran.Next(10);
while(getRanNum2 == getRanNum1)
    getRanNum2 = ran.Next(10);

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-05-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-17
      相关资源
      最近更新 更多