随机数组重复

时间:2017-03-07 16:14:35

标签: java arrays random

所以我正在创建一个便士游戏,其中代码将随机选择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];

问题在于有时候重复随机细胞。

我怎样才能使随机阵列单元无法重复或再次选择?

3 个答案:

答案 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)

  1. 创建一个包含25个整数的列表(右边有5x5网格?)并逐步初始化

    List<Integer> indexes = new ArrayList<>();
    for (int i = 0; i < 25; i++)
       indexes.add(i);
    
  2. 随机播放

    Collections.shuffle(indexes);
    
  3. (可选步骤,不是必需的)缩小列表,因为您只需要前5个索引

    indexes.subList(5, indexes.size()-1).clear(); //removing from index 5 to 24
    
  4. 将每个索引转换为行列坐标(例如:索引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]);
    }
    
  5. 我没有测试过,但我想这个想法非常简单。使用这种方法,您可以避免实现一个丑陋的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);
}