将重复的随机数生成器修改为非重复的随机数生成器

时间:2015-03-20 22:29:34

标签: java random

int size = 5;

int[] list = new int[size];

Random rand = new Random();
for(int i = 0; i < size; i++)
{
   list[i] = rand.nextInt(100);            
}

for(int element : list)
   System.out.print(element + " ");

我试图修改此随机数生成器,以便它不会复制随机生成的数字。我怎么能做到这一点?谢谢你的帮助。

4 个答案:

答案 0 :(得分:2)

可以想象的最愚蠢的方式实际上是一种可接受的策略:只丢弃已经存在于数组中的任何生成的数字。但是,如果您希望改进这一点,您将面临空间或时间成本(或两者)。对于您在问题中显示的数组大小,没有必要这样做。

答案 1 :(得分:1)

您可以将生成值存储在Set(这是一个包含唯一元素的数据结构中)。

每次生成新号码时,都可以检查Set中是否已存在。例如:

Set<Integer> set = new HashSet<Integer>();

Random rand = new Random();
for(int i = 0; i < size; )
{
   int next = rand.nextInt(100);;
   if (!set.contains(next)) {
       set.add(next);
       i++;
   } 
}

请注意,当尚未生成尚未生成的数字时,我只会增加索引

答案 2 :(得分:1)

有各种方法可以做到这一点。您已有的简单变体:

int size = 5;
int[] values = new int[100];
int[] list = new int[size];
for( int i = 0; i < 100; i++ ) values[i] = i;
Random rand = new Random();
int ctListSize = 0;
int xList = 0;
while( true ){
    int iCandidateValue = rand.nextInt(100);
    if( values[ iCandidateValue ] == 0 ) continue; // already used
    list[ xList++ ] = iCandidateValue;
    values[ iCandidateValue ] = 0;
    if( xList == size || xList == 100 ) break;
}

for(int element : list) System.out.print(element + " ");

答案 3 :(得分:0)

列出包含您在RNG上看到的所有号码的列表。然后检查列表是否存在 - 如果存在,请不要将其添加到列表中。如果它没有添加到列表中。

     for (int i = 0; i < array.length; i++){

      int num = rand.nextInt(100);
      if (list.contains(num){
          break;
      }else{
         list.add(num);
      }

这样您就可以返回列表,看不到重复项。

或者考虑使用只允许使用唯一键的Set数据结构。