【问题标题】:c# unique random numberc# 唯一随机数
【发布时间】:2016-02-05 06:47:32
【问题描述】:

我试图在 0 到 100 之间获取 X 个随机数(其中 X 是一个变量),并将它们添加到 DataGridView 中的一行。我正在使用下面的代码,但问题是我需要不可能有两次相同的数字。有没有办法确保我得到唯一的随机数?

int X = 20;
Random random = new Random();
int randomrow = random.Next(0, 100);

for (int i = 0; i < X; i++)
{
   int randomNumber = random.Next(0, 100);
   data.Rows[randomrow][3] = randomNumber;
}

感谢您的帮助!

【问题讨论】:

  • 使用 List 来保存你的随机值。当您生成一个新的时,检查它是否存在于该列表中,如果存在则生成一个新的,然后将它们全部添加到 DataGridView
  • 您想让randomrow 独一无二吗?还是randomNumber
  • 如果你想要一个真正的随机值,你需要使用 Random 类以外的东西。 Random is only psuedo-random。为了生成真实的,你可以使用类似RNGCryptoServiceProvider的东西。
  • 为什么 randomrow 永远不会改变?您正在更新同一行 x 次。

标签: c# random numbers


【解决方案1】:

一分为二:

  1. 创建一个包含 X 个随机唯一数字的列表。有很多方法可以做到这一点:

    一个。创建所有数字 0-100 的列表,然后创建 shuffle them。或

    b.保留您已创建的所有数字的哈希集(除了列表之外),只有在之前没有添加过的情况下才添加一个新数字。

  2. 然后,同时循环遍历列表和数据行并将值插入到行中。

【讨论】:

  • 列表应该是HashSet
  • @MatiasCicero:我不这么认为:哈希集没有定义的顺序,所以洗牌是不可能的。
  • 制作一个 0 到 100 的列表也不会有重复,然后洗牌基本上是 O(n)。这比生成随机唯一数字、重做所有已经存在的数字、同时拥有越来越多的现有数字要好得多。
  • @YoryeNathan 哦,我现在明白了,我的错!
  • @MatiasCicero:但是您对使用哈希集的建议是好的如果 OP 坚持他的原始算法。我已经添加了该选项。
【解决方案2】:

这是无需为 List 创建 shuffle 方法的简单方法(尽管有这样的示例)。基本上创建所有可能整数的列表,填充列表,然后按新的 GUID 排序。

        int X = 20;
        var RowNumbers = new List<int>();

        for (int i = 0; i < X; i++)
            RowNumbers.Add(i);

        foreach (int i in RowNumbers.OrderBy(f => Guid.NewGuid()))
        {
            data.Rows[i][3] = i;
        }

【讨论】:

    【解决方案3】:

    您需要将已经使用的数字与从 random.Next 获得的下一个数字进行比较。如果您已经使用它,请选择另一个。我也喜欢 Heinzi 的回答。

    【讨论】:

      【解决方案4】:

      这是没有洗牌的算法和以前的结果使用:

      var max = 100; // max available value
      var count = 20; // number of random numbers
      
      var random = new Random();
      var rest = (double)max;
      for (int i = 0; i < max; i++, rest--)
      {
          if (count / rest > random.NextDouble())
          {
              Console.WriteLine(i); // here is your random value
              count--;
      
              if (count == 0)
              {
                  break;
              }
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-11-20
        • 1970-01-01
        相关资源
        最近更新 更多