所以我正在创建一个便士游戏,其中代码将随机选择5个单元格。我这样设置:
int a = gen.nextInt(5);
int b = gen.nextInt(5);
int c = gen.nextInt(5);
int d = gen.nextInt(5);
int e = gen.nextInt(5);
int f = gen.nextInt(5);
int g = gen.nextInt(5);
int h = gen.nextInt(5);
int i = gen.nextInt(5);
int j = gen.nextInt(5);
int penny1 = Parray[a][b];
int penny2 = Parray[c][d];
int penny3 = Parray[e][f];
int penny4 = Parray[g][h];
int penny5 = Parray[i][j];
问题在于有时候重复随机细胞。
我怎样才能使随机阵列单元无法重复或再次选择?
答案 0 :(得分:1)
根据您的具体要求,这里有一个选项:
List<Integer> pennies = new ArrayList<>(NUMBER_OF_PENNIES);
for (int p = 0; p < NUMBER_OF_PENNIES; p++) {
Integer penny;
do {
int a = gen.nextInt(5);
int b = gen.nextInt(5);
penny = pArray[a][b];
} while (pennies.contains(penny));
pennies.add(penny);
}
这将确保便士列表没有重复任何值。相反,如果您不希望重复任何单元格索引,它会变得更复杂,但可以使用类似的技术。
我可以自由地将您的2D数组重命名为pArray
,以遵循Java命名约定。
答案 1 :(得分:1)
创建一个包含25个整数的列表(右边有5x5网格?)并逐步初始化
List<Integer> indexes = new ArrayList<>();
for (int i = 0; i < 25; i++)
indexes.add(i);
随机播放
Collections.shuffle(indexes);
(可选步骤,不是必需的)缩小列表,因为您只需要前5个索引
indexes.subList(5, indexes.size()-1).clear(); //removing from index 5 to 24
将每个索引转换为行列坐标(例如:索引8对应于第2行,第3列中的元素)并存储相应的便士
List<Integer> pickedPennies = new ArrayList<>();
for (int i = 0; i < 5; i++) {
int row = indexes.get(i) / 5;
int col = indexes.get(i) % 5;
pickedPennies.add(Parray[row][col]);
}
我没有测试过,但我想这个想法非常简单。使用这种方法,您可以避免实现一个丑陋的while循环来检查您是否已经选择了一分钱。
<强>替代强>:
将您的便士存放在列表中
List<Integer> pickedPennies = new ArrayList<>();
for (int i = 0; i < 5; i++)
for (int j = 0; j < 5; j++)
pickedPennies.add(Parray[i][j]);
并将其洗牌
Collections.shuffle(pickedPennies);
列表的前5个元素是随机便士
答案 2 :(得分:0)
您需要做的就是确保组合(a,b),(c,d)等是独一无二的,这样您的便士也是独一无二的。在5x5便士数组中获得唯一对的一种非常简单的方法(我认为你想要实现的是):
public static boolean checkIfComboExists(ArrayList<int[]> map,int[] combo){
for(int i = 0; i < map.size(); i++){
int[] elem = map.get(i);
if(elem[0] == combo[0] && elem[1] == combo[1]){
return true;
}
}
return false;
}
public static void main(String[] args){
int[][] Parray = {{1,2,3,4,5},{6,7,8,9,10},{11,12,13,14,15},{16,17,18,19,20},{21,22,23,24,25}};
Random gen = new Random();
ArrayList<int[]> map = new ArrayList<int[]>();
while (map.size() < 5){
int x = gen.nextInt(5);
int y = gen.nextInt(5);
int[] combo = {x,y};
if(!checkIfComboExists(map,combo)){
map.add(combo);
}
}
int newpenny1 = Parray[map.get(0)[0]][map.get(0)[1]];
int newpenny2 = Parray[map.get(1)[0]][map.get(1)[1]];
int newpenny3 = Parray[map.get(2)[0]][map.get(2)[1]];
int newpenny4 = Parray[map.get(3)[0]][map.get(3)[1]];
int newpenny5 = Parray[map.get(4)[0]][map.get(4)[1]];
System.out.println(newpenny1);
System.out.println(newpenny2);
System.out.println(newpenny3);
System.out.println(newpenny4);
System.out.println(newpenny5);
}