随机数生成器没有重复结果

时间:2013-04-26 08:11:28

标签: java random

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

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;

5 个答案:

答案 0 :(得分:2)

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

如果您只需要几打,请创建一系列连续数字并shuffle

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

答案 1 :(得分:0)

答案 2 :(得分:0)

您想要在没有替换的情况下进行采样。将所有ab,...,l放入大小为List<int>的内容中。从列表中选择随机元素删除它们。

答案 3 :(得分: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;
    }

}

答案 4 :(得分:0)

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

如果您要使用&&评估,则会检查!=评估的全部是否为false,如果其中一个是是的,它会跳到你的else

所以说你编号你的int a,int b ....作为1,2,... 12-因为你唯一一个不评估不等于的是a,它只会到达{{ 1}}当它们都是1.这是非常奇怪的,看看两个a=choice是否相等只是为了让它们相等!

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