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

32

我正在使用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;
}

2
九个零后面跟着一个1对你来说是有效的吗?如果是,那么你不能只是随机生成一个数字并用零填充吗? - Paul Phillips
1
谢谢,我发现这是一个有用的参考。我想指出,使用 += 重新分配字符串虽然可行,但效率低下。如果将其应用于更大的字符串,StringBuilder类可以在这里节省一些内存。 - mikey
1
随机 random = new 随机(); StringBuilder sb = new StringBuilder(); for (int i = 0; i < 10; i++) { sb.Append(random.Next(0, 9).ToString()); } return sb.ToString(); - mikey
2
  1. 你用这个数字做什么?与安全有关吗?你目前创建的数字非常可预测。
  2. 分布应该有多均匀?使用你目前的代码,只有20%的数字可以被访问,而有些数字比其他数字更有可能被访问。
- CodesInChaos
+1 更新:random.Next(1000000000,9999999999) 产生错误!!! - AminM
14个回答

24

使用此功能可以创建任意指定长度的随机数字

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;
}

3
如果您想多次使用,请勿使用此功能。应该在函数范围外声明随机对象,因为每次调用函数时,它都会创建一个Random对象的新实例,这可能会生成相同的数字。请参见https://dev59.com/jW435IYBdhLWcg3wtCWQ#5264434。 - Danhol86
1
@Danhol86,这个问题与您发布的链接不同。您发布的链接在构造函数中指定了一个种子,而这个没有。如果您没有指定种子,系统时钟将生成一个种子,这基本上保证了不同的数字。无论如何,了解这一点仍然是很好的。 - Caboosetp

12

尝试(虽然不绝对精确)

Random R = new Random();

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

将两个数字相乘的目的是什么,而不是只进行一次乘法运算? - Captain Prinny
它不会涵盖所有的10位数字。这种方法将无法覆盖10位数字范围内的质数。 - VSB

5
要获得任意位数的数字,可以使用 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)


5
如果您需要十个数字,但允许以0开头,则看起来您需要生成一个字符串,而不是长整数。
生成一个10个字符的字符串,在此字符串中,每个字符都从'0'..'9'中随机选择。

1
我确实这样做了,我的代码看起来就像上面更新的代码块。 - Hriskesh Ashokan

4
private void button1_Click(object sender, EventArgs e)
{
   Random rand = new Random();
   long randnum2 = (long)(rand.NextDouble() * 9000000000) + 1000000000;
   MessageBox.Show(randnum2.ToString());
}

4
// 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); 
    }
}

2
这怎么是一个随机数? - Neil Masson
每次调用此函数时,它都会返回一个不同的值。这几乎就像是随机值。这个解决方案对我很有效:我只需要在每次调用时获得不同的值,无论该值是什么。 - EAmez
在某些情况下,这段代码可能会产生重复。请对此进行一些研究。我曾经有过类似的代码,在循环中使用时可以正常工作,但将其移动到更快的计算机上并且它会在这里或那里连续返回几个重复项。非常令人恼火难以追踪。此外,时间的变化或多台计算机运行代码也可能会导致此问题。我只是说一下。 - user1544428

4
我提出了这种方法,是因为我不想使用 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));
}

希望这能帮到你。

1
我已经尝试了一百万次,成功了(对于长度为15位的数字)。 - Alparslan ŞEN

3

(1000000000,9999999999)并不是随机的——因为你限制它不能以1开头,所以已经削减了目标范围10%。

随机数是一个双精度浮点数,如果你想要一个整数,将其乘以1,000,000,000,然后舍去小数点后的数字即可。


1
我不确定随机与范围有任何关系。你可能正在描述可预测性而非随机性? - Lucas

1
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;
}

1
我尝试写了一个快速的程序:

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不可预知的值。 - Wai Ha Lee

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接