1

如何使随机数生成器不会重复数字?我试过了,但它一直给我重复的数字

public int random(int a, int b,int c,int d,int e,int f,int g,int h,int i,int j,int k,int l){
 Random generator = new Random();
 int choice = generator.nextInt(12) + 1;
 if((choice!=b)|(choice!=c)|(choice!=d)|(choice!=e)|(choice!=f)|(choice!=g)|(choice!=h)|(choice!=i)|(choice!=j)|(choice!=k)|(choice!=l)){
     a=choice;
 }
 else{
     random(a,b,c,d,e,f,g,h,i,j,k,l);


 }
 System.out.println(choice);
return a;
4

5 回答 5

2

这取决于在重复之前应该生成多少,因为如果您完全禁止所有重复,您最终必须用完。

如果您只需要几十个,请创建一个序列号数组并将它们打乱

如果您需要更长的序列,则需要在生成它们时记录它们,并且每当您看到重复时,请求另一个。HashSet在这里可以做得很好。

于 2013-04-26T08:16:33.817 回答
0

您想在不更换的情况下进行采样。将所有a, b,...放入大小为 12l的 aList<int>中。从列表中选择随机元素删除它们。

于 2013-04-26T08:18:49.463 回答
0

|或,评估将检查这些!=评估中的任何一个是否为真,然后继续进行a=choice

如果您要改用&&评估,它会检查所有评估是否为!=假,如果其中一个为真,它会跳到您的else.

所以假设你将你的 int a, int b.... 编号为 1,2,...12- 因为你唯一不评估不等于的是 a,它只会到达a=choice当它们都是 1 时. 这很奇怪,看看两个ints 是否相等只是为了让它们相等!

上面的其他人已经就如何实际获得非重复随机数给出了很好的选择,所以我将避免重复它们。

于 2013-04-26T08:37:11.337 回答
0

这是简单快速的解决方案。当然可能会更好:

import java.util.*;

public class RandomNumberGenerator {

    private ArrayList<Integer> usedNumbers;
    private Random r;
    private int maxNumber;

    public RandomNumberGenerator(int maxNumber) {
        r = new Random();
        usedNumbers = new ArrayList<Integer>();
        this.maxNumber = maxNumber;
    }

    public int next() {
        Integer res = r.nextInt(maxNumber);
        if (usedNumbers.contains(res)) {
            next();
        }
        usedNumbers.add(res);
        if (usedNumbers.size()==maxNumber) {
            usedNumbers.clear();
        }
        return res;
    }

}
于 2013-04-26T08:21:54.547 回答