如何生成具有特定范围的唯一随机数

时间:2015-08-05 11:41:43

标签: java arrays random numbers

我想在此范围内生成255个唯一随机数(0-255)。这样数组就不会包含重复的记录

short [] array =new short[255];
Random rand = new Random();
boolean   flag=false;
for (int i=0;i<array.length;i++){
    int random_integer = rand.nextInt(255-0) + 0;
    for (int j=0;j<i;j++){
        if ((short)random_integer==array[j]){
            flag=true;
        }
    }
    if (flag==false){
        array[i]=(short)random_integer;  
    }
}
for (int i=0;i<array.length;i++){
    System.out.println(array[i]);
} 

但我只得到前20个0r 30个带有值的项目,其余的数组项目等于零。

7 个答案:

答案 0 :(得分:3)

解决方案1:

我读过Jon Skeet的评论,当然,这是最简单的解决方案:

Foo/Bar

或者用Java 8声明式样式:

List<Integer> list = new ArrayList<>();
for (int i = 0; i < 255; i++) {
     list.add(i);
}
//and here is the point. Java already have this implemented for you
Collections.shuffle(list);

List<Integer> list= IntStream.range(0, 255)
    .boxed()
    .collect(Collectors.toList());
Collections.shuffle(list);

解决方案2(了解您的解决方案):

您需要为每个单元格生成数字,并检查此数字是否已存在:

List<Integer> list = new ArrayList<>();
IntStream.range(0, 255).forEach(list::add);
Collections.shuffle(list);

现在,让我们检查它是否存在:

 short [] array =new short[255];
 Random rand = new Random();

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

     //generate integer while it exists in the array
     while(exists(random_integer, array)) {
         random_integer = rand.nextInt(255);
     }

     array[i] = random_integer;
}

当然,您可以使用散列图来加速public boolean exists(int number, int[] array) { if (number == -1) return true; for (int i=0; i<array.length; i++) { if (number == array[i]) return true; } return false; } 方法,即将复杂度从O(n)降低到O(1);

答案 1 :(得分:2)

如果你可以使用java 8:

List<Integer> randIntegers = new Random().ints(1, 256).distinct().limit(255).boxed().collect(Collectors.toList());

答案 2 :(得分:1)

你检查是否存在随机数,但是你没有在你的循环中将标志重置为假,所以只要第一个重复的数字出现,就不会再发生任何事情了,因为标志总是正确的。

你也应该建立像:

这样的东西
if ((short)random_integer==array[j]){
  flag=true;
  i--;
}

确保在跳过重复的数字之后重新访问数组的索引。

答案 3 :(得分:1)

UPDATE

答案 4 :(得分:0)

您需要在每次迭代中重置flag值或更改逻辑:

       for (int j=0;j<i;j++){
                flag=false;//<--
                if ((short)random_integer==array[j]){
                    flag=true;
                }
            }

答案 5 :(得分:0)

您是否考虑过创建一个HashSet并将您使用过的值放入其中? 然后你的代码应该是这样的:

HashSet hs = new HashSet();
short [] array =new short[255];
Random rand = new Random();

for (int i=0;i<array.length;i++){
int random_integer = rand.nextInt(255-0);
if (!hs.contains(random_integer ))
{
array[i]=(short)random_integer;  
hs.put(random_integer);
}
else{ //generate new integer}
}

答案 6 :(得分:-1)

如果没有适当的缩进,很难阅读代码。

无论如何 - 如果flag == true,你什么都不做。很明显,你不会填充阵列中的许多地方。