【问题标题】:How to generate a random 10 digit number in C#?如何在 C# 中生成一个随机的 10 位数字?
【发布时间】:2011-10-26 16:43:22
【问题描述】:

我正在使用 C#,我需要生成一个随机的 10 位数字。到目前为止,我只是幸运地找到了指示最小最大值的示例。我将如何生成一个 10 位的随机数,它可以以 0 开头,(最初,我希望 random.Next(1000000000,9999999999) 但我怀疑这是我想要的)。

我的代码现在看起来像这样:

[WebMethod]
public string GenerateNumber()
{
    Random random = new Random();
    return random.Next(?);
}

**更新结果是这样的,

[WebMethod]
public string GenerateNumber()
{
    Random random = new Random();
    string r = "";
    int i;
    for (i = 1; i < 11; i++)
    {
        r += random.Next(0, 9).ToString();
    }
    return r;
}

【问题讨论】:

  • 九个零后跟一个 1 对您有效吗?如果是这样,你不能只做一个随机数并用零填充吗?
  • 谢谢,我发现这是一个有用的参考。我要指出,用 += 重新分配字符串可以正常工作,但效率低下。 StringBuilder 类可以在这里为您节省一些内存,尤其是如果有人将其应用于更大的字符串。
  • 随机随机=新随机(); StringBuilder sb = new StringBuilder(); for (int i = 0; i
  • 1) 你用这个号码做什么?有什么安全相关的吗?您当前创建的数字是非常可预测的。 2) 分布应该有多均匀?使用您当前的代码,只能达到 20% 的数字,其中一些数字比其他数字更有可能。
  • +1 更新 :) , random.Next(1000000000,9999999999) 产生错误!!!

标签: c# .net asp.net random


【解决方案1】:

(1000000000,9999999999) 不是随机的 - 您要求它不能以 1 开头,因此您已经将目标基数减少了 10%。

Random 是一个双精度数,因此如果您想要一个整数,请将其乘以 1,000,000,000,然后去掉小数点后的数字。

【讨论】:

  • 我不确定随机是否与范围有关。您可能在描述可预测性而不是随机性?
【解决方案2】:

如果你想要十位数字,但你允许以 0 开头,那么听起来你想生成一个字符串,而不是长整数。

生成一个 10 个字符的字符串,其中每个字符从 '0'..'9' 中随机选择。

【讨论】:

  • 确实做到了,我的代码看起来像上面的更新块。
【解决方案3】:

尝试(虽然不是绝对准确)

Random R = new Random();

return ((long)R.Next (0, 100000 ) * (long)R.Next (0, 100000 )).ToString ().PadLeft (10, '0');

【讨论】:

  • 将两个数相乘而不是单次相乘的目的是什么?
  • 它不会覆盖所有 10 位数字。此方法不会覆盖 10 位数字范围内的素数。
【解决方案4】:

在 C# 中生成一个随机的 10 位数字

Random RndNum = new Random();   

int RnNum = RndNum.Next(1000000000,9999999999);

【讨论】:

  • 9999999999 溢出int.MaxValue,因此无法编译。
【解决方案5】:
private static Random random = new Random((int)DateTime.Now.Ticks);//thanks to McAden

public long LongBetween(long maxValue, long minValue)
{
    return (long)Math.Round(random.NextDouble() * (maxValue - minValue - 1)) + minValue;
}

【讨论】:

    【解决方案6】:
    private void button1_Click(object sender, EventArgs e)
    {
       Random rand = new Random();
       long randnum2 = (long)(rand.NextDouble() * 9000000000) + 1000000000;
       MessageBox.Show(randnum2.ToString());
    }
    

    【讨论】:

      【解决方案7】:

      使用它来创建任意指定长度的随机数字

      public string RandomDigits(int length)
      {
          var random = new Random();
          string s = string.Empty;
          for (int i = 0; i < length; i++)
              s = String.Concat(s, random.Next(10).ToString());
          return s;
      }
      

      【讨论】:

      • 如果您打算多次使用此功能,请不要使用它。随机对象应在函数范围之外声明,因为每次它都会创建随机对象的新实例,这可能意味着生成相同的数字。见stackoverflow.com/a/5264434/6099813
      • @Danhol86 这与您发布的链接没有相同的问题。您发布的内容在构造函数中指定了一个种子,而这没有。如果您不指定种子,则会从系统时钟生成一个种子,主要保证不同的数字。还是很高兴了解任何一种方式。
      【解决方案8】:
      // ten digits 
      public string CreateRandomNumber
      {
          get
          {
              //returns 10 digit random number (Ticks returns 16 digit unique number, substring it to 10)
              return DateTime.UtcNow.Ticks.ToString().Substring(8); 
          }
      }
      

      【讨论】:

      • 这怎么是随机数?
      • 每当你调用这个函数时,它都会返回一个不同的值。这几乎就像随机值。这个解决方案对我有用:我只需要在每次调用它时获取不同的值,不管值是什么。
      【解决方案9】:

      要获得不带任何循环的任意数字,请使用 Random.Next 和适当的限制 [100...00, 9999...99]。

      private static readonly Random _rdm = new Random();
      private string PinGenerator(int digits)
      {
         if (digits <= 1) return "";
      
         var _min = (int)Math.Pow(10, digits - 1);
         var _max = (int)Math.Pow(10, digits) - 1;
         return _rdm.Next(_min, _max).ToString();
      }
      

      这个函数计算第n个数字的下限和上限。

      要生成 10 位数字,请像这样使用它:

      PinGenerator(10)

      【讨论】:

        【解决方案10】:
        Random random = new Random();
        string randomNumber = string.Join(string.Empty, Enumerable.Range(0, 10).Select(number => random.Next(0, 9).ToString()));
        

        【讨论】:

          【解决方案11】:

          我想出这个方法是因为我不想使用 Random 方法:

          public static string generate_Digits(int length)
          {
              var rndDigits = new System.Text.StringBuilder().Insert(0, "0123456789", length).ToString().ToCharArray();
              return string.Join("", rndDigits.OrderBy(o => Guid.NewGuid()).Take(length));
          }
          

          希望这会有所帮助。

          【讨论】:

          • 我已经尝试了 100 万次成功(长度为 15 位)
          【解决方案12】:

          我试着写一个快的:

          private int GetNDigitsRandomNumber(int digits)
          {
              var min = 1;
              for (int i = 0; i < digits-1; i++)
              {
                    min *= 10;
              }
              var max = min * 10;
          
              return _rnd.Next(min, max);
          }
          

          【讨论】:

          • 这不适用于十位数字,因为 int 可表示的值范围是 ~±2*10^9 - 所以一旦 min 是 10^8 你就会溢出并且得到 max 的意外值。
          【解决方案13】:

          这是一个使用格式字符串的简单解决方案:

          string r = $"{random.Next(100000):00000}{random.Next(100000):00000}";
          

          随机 10 位数字(可能有前导零)作为两个随机 5 位数字的并集生成。格式字符串“00000”表示如果数字短于 5 位,将附加前导零(例如,1 将被格式化为“00001”)。

          有关“0”自定义格式说明符的更多信息,请参阅documentation

          【讨论】:

            猜你喜欢
            • 2010-09-07
            • 2018-05-20
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-07-24
            • 2012-04-20
            • 2022-01-23
            • 1970-01-01
            相关资源
            最近更新 更多