我需要从集合{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;
}
}
}
答案 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足够好?别的什么?这将决定您使用的计数器类型。