如何在Java中获取特定数量的随机整数

时间:2013-12-26 16:15:06

标签: java random

我需要从集合{0,1,2,3,4}获得4到8个不同的对(x,y)整数,并将位置(x,y)上的一个2D数组的成员写入另一个。 我在下面尝试过这种方式,但它不起作用。

int ra =nextRandomNumber();
    int nu = (ra%5) + 4;

int c=0;
int [] poss= new int[8];


while(c<nu){
        int p =nextRandomNumber();
        int q =nextRandomNumber();
        int x=p%5 ;
        int y=q%5;
        int m=10*x+y;
        int co=0;
    for(int i=0; i<c; i++){
        if(m!=poss[i])
                co+=1;
        }
        if (co==c+1){
            poss[c]=m;
    frame.getLabel().getLabelTable()[x][y]
                    .setText("" + tabla[x][y]);
    c+=1;
}
    }
        }

我通过以下方式创建了nextRandomNumber:

private static int nextRandomNumber(){
    long curr = System.currentTimeMillis();
    int p = (int) (curr%120);
    return p;
}

我希望你明白我的意思,你可以帮助我。

我做了什么Sibbo建议我,现在我有全桌,但我只需要4-8个数字。所以我试着在下面的路上解决,但它仍然给了我全桌。

Random ra =new Random();
    int nu=ra.nextInt(5)+4;

    Set<Pair> alreadyUsed = new HashSet<Pair>();
    Pair result;

    do {
        result = new Pair(ra.nextInt(5), ra.nextInt(5));
      frame.getLabel().getLabelTable()[result.getX()][result.getY()]
        .setText("" + tabla[result.getX()][result.getY()]);
    }while (!alreadyUsed.contains(result)&&alreadyUsed.size()<nu);

    alreadyUsed.add(result);
}

我使用下面的代码解决了这个问题。谢谢大家的帮助。

Random ra =new Random();
Random r1 =new Random();
Random r2 =new Random();
    int nu=ra.nextInt(5)+4;
    boolean [][] exists= new boolean [5][5];
    for (int i=0; i<5; i++){
        for(int j=0; j<5; j++){
            exists [i][j]=false;
        }
    }
    int c=0;
    while (c<nu){
        int p=r1.nextInt(5);
        int q=r2.nextInt(5);
        if(exists[p][q]==false){
            frame.getLabel().getLabelTable()[p][q]
                .setText("" + tabla[p][q]);
            exists[p][q]=true;
            c+=1;
        }
    }
        }

3 个答案:

答案 0 :(得分:1)

针对您的具体问题,您可以轻松使用以下内容:

    Random random = new Random();
    List<Point> pairs = new ArrayList<Point>();
    List<Point> resultPairs;

    for(int x=1; x<5; x++)for(int y=1; y<5; y++)
    pairs.add(new Point(x,y));          

    Collections.shuffle(pairs, random); 
    resultPairs = pairs.subList(0, 4+random.nextInt(5)); //take 4 to 8 elements 

//Debug-print out lists
    System.out.println("Initial Points");
    for(Point p: pairs)System.out.println("("+p.x+","+p.y+")");

    System.out.println("Random Points " + resultPairs.size());
    for(Point p: resultPairs)System.out.println("("+p.x+","+p.y+")");       

我们创建了一个包含x和y(16种不同组合)的所有可用对的列表,然后随机地对列表进行随机播放。

然后我们简单地获取我们想要的X(4到8)元素的子列表。

应用于您的代码,这将使:

//Do the GUI operations
for(Point p: resultPairs)
frame.getLabel().getLabelTable()[p.x][p.y].setText("" + tabla[p.x][p.y]);

答案 1 :(得分:0)

要获取随机数,请使用Random类:

Random r = new Random();

r.nextInt(5); // Returns a random integer between 0 and 4 inclusive.

要获得不同的随机数,请使用一组:

Set<Pair<Integer>> alreadyUsed = new HashSet<Pair<Integer>>(); // You have to write the pair class yourself.

现在生成如下数字:

Pair<Integer> result;

do {
    result = new Pair<Integer>(r.nextInt(5), r.nextInt(5));
while (!alreadyUsed.contains(result);

alreadyUsed.add(result);

答案 2 :(得分:0)

查看您的代码并跟踪您的逻辑,然后跟踪Sibbo的逻辑。你在这里对逻辑进行了根本性的改变。

基本上,您需要添加行

frame.getLabel().getLabelTable()[result.getX()][result.getY()].setText("" + tabla[result.getX()][result.getY()]);

在Sibbo代码的最后一行之后。然后用某种计数器包围整个街区,告诉你何时有4-8个结果。

您还需要考虑如何确定自己有足够的结果。计算机不喜欢像“4-8”这样模糊的东西。想要一些随机数的结果吗?你想要有一个最佳尝试次数,如果你先达到8次就停止,如果没有至少4次则继续吗?还是4足够好?别的什么?这将决定您使用的计数器类型。