生成多个随机数

8
我想要生成25个独特的随机数字,并在控制台中列出它们。这些数字应至少具有10个字符长度。有什么简单的方法可以实现吗?

1
你所说的字符是指十进制数字吗? - Mark Byers
是的,它们也可以是字母数字字符。请不要使用 GUID。 - Jasl
1
字母数字字符不等于随机数字。你想要随机字符串。 - RvdK
5个回答

13
尝试将数字构建为字符串,并使用 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
...等等...

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


2
问题在于“25个独特的随机数”。显示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
@IVlad:我本意是要写10个“9”。r.Next()返回的是一个double而不是int,所以我使用了它。 - Jens
不,r.Next() 返回一个整数。你需要使用 r.NextDouble(),即使这样你也在过度复杂化事情。 - IVlad

1

随机性和唯一性之间存在很大的区别。

因此,如果您需要真正的唯一数字,您必须确保在某个地方保存所有已创建的数字,并检查您新创建的数字是否不在该列表中,或者您必须提供某种算法,确保给定的数字不能被重复创建。

为了使第二部分起作用,您通常要获取创建时刻的日期/时间,因为当前的日期/时间对永远是唯一的。唯一的问题是每(毫)秒有多少次创建以及有多少位可用于存储您的唯一数字。

这里提供一个使用12位数字的示例(在此处制作)。希望这可以帮助到您。


0

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

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和最大数字之间随机生成数字的位数。然后在StringBuilderList中随机生成每个数字(或数字组)。你可以使用我上面使用的HashSet方法来确保唯一性。


-2
 Random rnd = new Random(table);
 for(int i = 0; i < 25; ++i) {
   Console.WriteLine("{0}", rnd.Next(50, 50+i) 
 }

你能给一个在数字计算机上可以保证百分之百的技术建议吗? - Preet Sangha

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