生成多个随机数

时间:2010-05-31 09:08:39

标签: c# .net-4.0 unique random

我想生成25个唯一的随机数,并将它们列在控制台中。这些数字至少应为10个字符。有没有简单的方法呢?

5 个答案:

答案 0 :(得分: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
...etc...

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

答案 1 :(得分: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)

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

答案 2 :(得分:1)

随机性和唯一性之间存在很大差异。

因此,如果您需要真正的唯一数字,您必须确保将所有已创建的数字保存在某处,并检查新创建的数字是否不在此列表中,或者您必须提供某些算法确保给定数字不能创建两次。

为了使第二部分起作用,你大部分时间都是创造时刻的日期/时间,因为当前的日期/时间对永远是唯一的。唯一的问题是你有多少每(毫秒)的创作数量以及可用于存储你的唯一数字的数字。

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

答案 3 :(得分: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方法来确保唯一性。

答案 4 :(得分:-2)

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