生成唯一随机数列表

问题描述:

所以,我有一个随机数生成器,它在1和用户输入的最大值之间生成10个数字。它运作良好,但我想让它不会产生重复的数字。因此,如果它生成一个5,其他数字都不能是5.生成唯一随机数列表

+0

什么语言是你使用? – 2013-04-28 06:21:08

+0

对不起,错过了。通常,人们会标记语言而不是将其包含在标题中。 (将为他编辑) – 2013-04-28 06:21:45

+0

一种解决方案可能是使用Set而不是List。如果它生成一个副本。设置将忽略它,你可以再次生成一个新的号码。继续操作,直到设置尺寸未达到极限,即您的情况下有10个数字。 – 2013-04-28 06:23:20

您可以尝试拒绝采样。从空集开始。生成一个数字,如果它在集合中,请再试一次。这就是说继续选择,直到你找到一个不在集合中的数字。找到新号码后,将其添加到设置中,然后将其返回给用户。

当然,如果产生了大量的数字,比如说k和上限是n,那么得到一个新数字的时间遵循几何分布(成功概率(nk)/ n),所以在找到唯一编号之前所需的采样数量是n /(nk)。

如果您有一个最小值,您可以使用Collection.shuffle()一个唯一值列表。从这里你可以选择10个元素。

+0

最大值将随我所制作的节目而变化。我可以在5到50之间的任何地方。而且,它实际上是随机选择字母,我只是让它在随机数的位置得到一个字符串的字符。 – user2328462 2013-04-28 08:17:51

+0

范围必须与您要选择的数量相同或更大。您不能获得10个唯一值,其最大范围小于10。 5. – 2013-04-28 16:55:02

您不是第一个问这个问题的人。有关一般答案,请参阅https://crypto.stackexchange.com/questions/1379/how-to-generate-a-list-of-unique-random-strings

为了确保号码不重复,请将找到的号码存储在Java SET中,以便只在内部没有重复时才添加。

Algorith随机生成可以是这样的:

take the system time as your seed value 
use this to get the random numbers 
suppose user says number between 1-100 
so take system milliseconds%100 so time always changes so maximum probability that you get random numbers. 

所以,始终以种子值MOD(%)的上限,在这种情况下它的100

int i = 0, r = 0; 
    boolean ch = true; 
    int[] list = new int[num]; 
    while (i < num) 
    { 
     r = rnd.nextInt(num); 
     ch = true; 
     for (int j = 0; j < i; j++) 
      if (r == list[j]) 
      { 
       ch = false; 
       break; 
      } 
     if (ch) 
     { 
      list[i] = r; 
      i++; 
     } 
    } 
+1

在解释什么是代码和控制点时增加几点。 – Phani 2015-09-14 13:11:14