【问题标题】:Generating multiple random numbers生成多个随机数
【发布时间】:2025-11-21 08:55:02
【问题描述】:

我想生成 25 个唯一的随机数并在控制台中列出它们。数字应至少有 10 个字符长。有什么简单的方法吗?

【问题讨论】:

  • 按字符我猜你是指十进制数字?
  • 是的,它们也可以是字母数字字符。请不要使用 guid
  • 字母数字!= 随机数。你想要随机字符串

标签: c# .net-4.0 unique random


【解决方案1】:

尝试将数字构建为字符串,并使用 HashSet 确保它们是唯一的:

Random random = new Random();
HashSet<string> ids = new HashSet<string>();

while (ids.Count < 25)
{
    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < 10; ++i)
    {
        sb.Append(random.Next(10));
    }
    ids.Add(sb.ToString());
}

示例输出:

7895499338 2643703497 0126762624 8623017810 ...ETC...

HashSet 类存在于 .NET 3.5 及更高版本中。

【讨论】:

    【解决方案2】:

    问题在于“25 unique random”。显示 25 个随机数很简单

    Random r = new Random();
    for(int i=0; i<25; i++)
        Console.WriteLine(r.Next(1,100).ToString());
    

    不过,这些不一定是唯一的。如果您不想允许重复,则需要以某种方式存储以前生成的数字,如果遇到旧数字,请再次滚动。

    请注意,您可以通过这种方式更改生成数字的概率分布。

    编辑:我刚刚注意到这些数字应该是十个字符长。由于 9,999,999,999 超过了 Int32.MaxValue,我建议使用 Math.Floor(r.NextDouble() * 10000000000 + 1000000000) 而不是 r.Next(1,100)

    由于您的号码很长,因此您不必担心重复。他们非常不可能。

    【讨论】:

    • 999 999 999 不超过int.MaxValue。但是,将 r.Next() 乘以十亿可能。
    • @IVlad:我的意思是写 10 个 '9's。 r.Next() 返回一个 double 而不是 int,这就是我使用它的原因。
    • 不,r.Next() 返回一个 int。你想要r.NextDouble(),即使那样你也把事情复杂化了。
    【解决方案3】:

    随机性和唯一性之间有很大的不同。

    因此,如果您确实需要唯一号码,则必须确保将所有已创建的号码保存在某个位置,并检查您新创建的号码是否不在此列表中,或者您必须提供一些算法这样可以确保给定的数字不会被创建两次。

    要使第二部分正常工作,您主要采用创建时刻的日期/时间,因为当前日期/时间对永远是唯一的。唯一的问题是您每(毫秒)秒有多少创造,以及有多少位可用于存储您的唯一编号。

    关于使用 12 位数字 is made here 的示例。希望这会有所帮助。

    【讨论】:

      【解决方案4】:

      一个简单的方法是这样的:

      class Test
      {
          private static void Main()
          {
              Random rand = new Random();
      
              for (int i = 0; i < 25; ++i)
              {
                  Console.WriteLine(rand.Next(1000000000, int.MaxValue));
              }
          }
      }
      

      这将确保数字始终为 10 个字符(数字)长。然而,它们不一定是唯一的。如果您希望它们绝对是独一无二的,则必须执行以下操作:

      class Test
      {
          private static void Main()
          {
              Random rand = new Random();
      
              var generatedSoFar = new HashSet<int>();
              for (int i = 0; i < 25; ++i)
              {
                  int newRand;
                  do
                  {
                      newRand = rand.Next(1000000000, int.MaxValue);
                  } while (generatedSoFar.Contains(newRand)); // generate a new random number until we get to one we haven't generated before
      
                  generatedSoFar.Add(newRand);
      
                  Console.WriteLine(newRand);
              }
          }
      }
      

      如果您希望能够有 10 位以上的数字,您可以在 10 和最大位数之间随机生成位数。然后在StringBuilderList 中随机生成每个数字(或数字组)。您可以使用我上面使用的相同HashSet 方法来确保唯一性。

      【讨论】:

        【解决方案5】:
         Random rnd = new Random(table);
         for(int i = 0; i < 25; ++i) {
           Console.WriteLine("{0}", rnd.Next(50, 50+i) 
         }
        

        【讨论】:

        • 你能推荐一种在数字计算机上得到保证的技术吗?我的意思是 100%?