选择一些特定范围内的随机数,不要重复

时间:2014-10-13 17:41:20

标签: java random

我想在0-7范围内选择8个随机整数。

int one = (int) (Math.random()*0)+7;
int two = (int) (Math.random()*0)+7;
// ...
int eight = (int) (Math.random()*0)+7;

但是,不允许重复的数字。如何改进此代码以建立此功能?

5 个答案:

答案 0 :(得分:0)

按照以下代码段,根据您的偏好更改maxLimit和noOfItems,以获得所需的结果。

此处Set包含指定限制下的唯一整数。

public class RandomIntegers
{
    public static final Random random = new Random();
    public static final int maxLimit = 8;
    public static final int noOfItems = 8;
    public static void main( String[] args )
    {
        Set<Integer> uniqueRandomIntegerSet = new HashSet< Integer >(); 
        
        while(uniqueRandomIntegerSet.size() < noOfItems)
            uniqueRandomIntegerSet.add( random.nextInt( maxLimit ) );
    }
}

答案 1 :(得分:0)

我不确定这是否违反了您的要求,但您可以这样做:

public static void main(String[] args) {
    List<Integer> randomZeroToSeven = new ArrayList<>();
    for (int i = 0; i <= 7; i++) {
        randomZeroToSeven.add(i);
    }
    Collections.shuffle(randomZeroToSeven);
}

或者,您可以跳过shuffle,每次想要0-7的随机数时,只需从列表中抓取一个随机元素。 EG:

public static void main(String[] args) {
    List<Integer> zeroToSeven = new ArrayList<>();
    for (int i = 0; i <= 7; i++) {
        zeroToSeven.add(i);
    }

    System.out.println(zeroToSeven.get(new Random().nextInt(8)));

}

答案 2 :(得分:0)

如果您需要生成从minmax(包括两者)的数字,您可以写信 random.nextInt(max - min + 1) + min

public static void main(String[] args) throws IOException {

        HashSet<Integer>list=new HashSet();
       Random random=new Random();
         while(list.size()<8){
            list.add(random.nextInt(7 - 0 + 1) + 0); // OR list.add(random.nextInt(8));

         }
         System.out.println(list);

    }

答案 3 :(得分:0)

另一种方法是用所有可能性填充数组/集合并从中挑选。从允许的数组中删除每个拾取的项目并将其放入输出数组中,直到您选择了所有项目。

这样你就可以跳过双选,执行是线性的。

这样的事情:

int desiredSize = 8;
List<Integer> allowed = new ArrayList<>();
for (int i = 0; i < desiredSize; i++) {
    allowed.add(i);
}

List<Integer> output = new ArrayList<>();
Random random = new Random();
while (output.size() < desiredSize) {
    int index = random.nextInt(allowed.size());
    output.add(allowed.get(index));
    allowed.remove(index);
}

答案 4 :(得分:0)

0-7只有8个整数,所以你真正要求的是随机顺序中0-7的数字。

执行编码和执行的最快方法是对一组整数进行随机播放。

public class Test {

    public static void main(String[] args){

        List<Integer> list = Arrays.asList(0, 1, 2, 3, 4, 5, 6, 7);
        Collections.shuffle(list);
        for(int i : list){
            System.out.println(i);
        }

    }
}

如果你想自己编写一个shuffle算法,你可以通过交换随机索引的数组中的每个项目(最后一个)来实现。你不做最后一次的原因是因为它会影响结果。见Fisher Yates Shuffle

因为我无法抗拒这里是Fisher Yates的java实现:

public class Test {

    public static void main(String[] args){
        Random rnd = new SecureRandom();
        int[] arr = new int[]{0,1,2,3,4,5,6,7};
        for(int i = 0; i < arr.length - 1; i++){
            int swapIndex = rnd.nextInt(8);
            int tmp = arr[i];
            arr[i] = arr[swapIndex];
            arr[swapIndex] = tmp;
        }
        System.out.println(Arrays.toString(arr));

    }

}