【问题标题】:Why I cannot generate more than 6551 random numbers为什么我不能生成超过 6551 个随机数
【发布时间】:2020-11-01 13:11:51
【问题描述】:

我在简单控制台应用程序的 Main 方法中有以下 C# 代码。

我已经调试过了,在 List.Count = 6551 之后,随机值似乎在重复。

List<int> list = new List<int>(9999);
bool waiting = true;
Random random = new Random(DateTime.Today.Milliseconds);

do
{
    int units = random.Next(0, 9);
    int tens = random.Next(0, 9);
    int hundreds = random.Next(0, 9);
    int thousands = random.Next(0, 9);

   int result = int.Parse(String.Format("{0}{1}{2}{3}", units, tens, hundreds, thousands));

   if(list.Contains(result))
   {
       continue;
   }
   else
   {
       list.Add(result);
   }

   if(list.Count == 9999)
   {
       waiting = false;
   }

}while(waiting);

Console.WriteLine("Finished"):
Console.ReadKey();

【问题讨论】:

  • 您有不完整的代码和不完整的问题。请用完整的陈述和您的期望更新您的问题
  • 对不起,我现在就完成代码
  • 因为我的真正目的是生成 4 位数字作为字符串,包括左 0,例如:0001、0045 等
  • 只做random.Next(6561) 效率更高。如果您有其他目的,则应将其包含在您的帖子中

标签: c# random


【解决方案1】:

您的数字范围从 0 到(不包括!)9,每个数字有 8 个选择 (0-8),因此有 6561 个组合 (9*9*9*9)。

另外,请注意您的算法效率极低。最终,您的列表将非常拥挤,然后,算法将花费大部分时间检查给定的随机数是否已包含在您的结果列表中。

如果您的目标是洗牌索引,则可以通过保留尚未插入的索引列表来更有效地实现这一目标。

【讨论】:

    【解决方案2】:

    Georg已经给出了答案,但是关于你的效率问题:如果你想要的是一个打乱的整数列表,你可以用列表上的扩展方法来做到这一点。

    var shuffled = Enumerable.Range(0, 10000).Shuffle();
    

    在这里查看更多信息An extension method on IEnumerable needed for shuffling

    【讨论】:

      猜你喜欢
      • 2018-11-23
      • 1970-01-01
      • 2021-02-07
      • 2011-05-21
      • 2014-11-17
      • 2021-12-10
      • 1970-01-01
      • 2023-03-30
      • 2017-03-03
      相关资源
      最近更新 更多