2010-05-31 201 views
8

我想生成25个唯一的随机数并在控制台中列出它们。这些数字应该至少有10个字符。任何简单的方法来做到这一点?生成多个随机数

+1

按字符我猜你是指十进制数字? – 2010-05-31 09:12:58

+0

是的,他们也可以是字母数字字符..没有guid的请 – Jasl 2010-05-31 09:14:56

+1

字母数字!=随机数字。你想要随机字符串 – RvdK 2010-05-31 09:16:28

回答

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和更新。

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)

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

+0

'999 999 999'不超过'int.MaxValue'。然而,将r.Next()乘以十亿。 – IVlad 2010-05-31 09:30:42

+0

@IVlad:我打算写10'9。 'r.Next()'返回一个double而不是int,这就是我使用它的原因。 – Jens 2010-05-31 09:38:47

+0

否,'r.Next()'返回一个int。你想'r.NextDouble()',即使如此,你也是过于复杂的事情。 – IVlad 2010-05-31 09:40:35

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

不保证是唯一的。 – crazyscot 2010-05-31 09:16:42

+0

你可以在数字计算机上提供一种保证技术。我的意思是100%? – 2010-06-09 21:15:27

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方法来确保唯一性。

1

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

所以,如果你真的需要独特号码,你必须确保你保存的地方都已经创建了数字和检查,如果新创建一个不在此列表中,或者您必须提供一些算法,确保了给定的数字不能创建两次。

为了让第二部分工作,您大多需要创建时刻的日期/时间,导致当前日期/时间对永远是唯一的。唯一的问题是您每秒(毫秒)有多少个创作,以及有多少位可用于存储您的唯一编号。

关于使用12位数的示例is made here。希望这可以帮助。