微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

二维数组随机索引乐透游戏

如何解决二维数组随机索引乐透游戏

我正在尝试做一个乐透游戏,我必须生成一张随机卡片,第一列中的数字从 1-9,第二列 10-19 一直到 90。卡片的另一个规则是它每行中的随机位置只能有 5 个数字,这就是我遇到的问题。

我已经开始在每一列中输入数字

int[][] numberCard = new int[3][9];

for (int i = 0; i < numberCard.length; i++) {
    numberCard[i][0] = randInt(1,9);
}

for (int j = 0; j < numberCard.length; j++) {
    numberCard[j][1] = randInt(10,19);
}

然后将 5 个数字放在数组的每一行的数字位置,我试过这个:

//Five numbers first line
Random random0 = new Random();
int randomLocation = 0;

while (randomLocation < 5) {
    int z0 = random0.nextInt(numberCard.length);
    int b0 = random0.nextInt(numberCard[0].length);

    if (numberCard[z0][b0] > 0) {
        numberCard[z0][b0] = 0;
        randomLocation++;
    }
}

//Five numbers second line
Random random1 = new Random();
int randomLocation1 = 0;

while (randomLocation1 < 5) {
    int z1 = random1.nextInt(numberCard.length);
    int b1 = random1.nextInt(numberCard[1].length);

    if (numberCard[z1][b1] > 0) {
        numberCard[z1][b1] = 0;
        randomLocation1++;
    }
}

然后第三个也是一样。

输出

0 | 18 |  0 |  0 | 46 |  0 | 61 | 72 | 88 |
0 | 18 |  0 | 31 |  0 | 55 |  0 |  0 |  0 | 
0 |  0 | 23 | 34 | 45 |  0 |  0 |  0 | 80 |

问题是有时我会得到 5 个数字,有时是 6 个,有时是 4 个,而有时我会在每行中得到完美的 5 个数字。更令人沮丧的是,不工作只是有时工作......

我认为并且我认为这是因为随机数有时会重复,因此它们会转到相同的索引,但有时我有超过 5 个数字,因此没有任何意义。

预期的正确输出

0 | 18 | 23 | 30 | 48 |  0 |  0 | 76 |  0 | 
0 | 12 | 24 |  0 |  0 | 58 | 61 | 78 |  0 | 
1 | 17 |  0 |  0 | 42 | 54 |  0 |  0 | 86 | 

解决方法

这里的代码与之前几乎相同。卡片变成了行。

# A tibble: 4 x 6
  dum1  dum2  dum3  dum4  value which_tech
  <chr> <chr> <chr> <chr> <dbl> <chr>     
1 ""    "2"   ""    "4"      12 24        
2 "1"   "2"   ""    ""       20 12        
3 ""    "2"   ""    "4"      32 24        
4 "1"   ""    "3"   ""       27 13   

印刷品

public static void lottery() {
    System.out.println("  1  2  3  4  5  6  7  8  9");
    System.out.println("---------------------------");

    for (int card = 1; card<= 5; card++) {
        List<Integer> numbers = new ArrayList<>();
        for (int i = 0; i <= 8; i++) {
            int s = i > 0 ? 0 : 1;  
            numbers.add(ThreadLocalRandom.current().nextInt(i*10 + s,(i+1)*10));
        }
        Collections.shuffle(numbers);
        int[] row = new int[9];
        for (int s = 0; s < 5; s++) {
            int pick = numbers.get(s);
            row[pick/10] = pick; 
        }
        for (int i = 0; i < 9; i++) {
            System.out.printf("%3d",row[i]);
        }
        System.out.println();
    }
}
,

我认为您的方法比应有的复杂。我建议这样做:

对于二维数组的每一行,生成一个 [1 - 90) 之间的随机数,并通过将随机数除以 10(将​​为您提供值 [0 - 8])将其放到它所属的位置,同时检查该位置是否没有分配随机值。重复 5 次。

public static void main(String[] args) {
    int[][] numberCard = new int[3][9];

    Random rand = new Random();
    for (int i = 0; i < numberCard.length; i++) {
        for (int j = 0; j < 5; j++) {
            int x = rand.nextInt(89) + 1;
            while (numberCard[i][x / 10] != 0) {
                x = rand.nextInt(89) + 1;
            }
            numberCard[i][x / 10] = x;
        }
    }

    //print or do whatever with your numberCard array

    for (int[] row : numberCard) {
        System.out.println(Arrays.toString(row));
    }
}

示例输出:

[0,24,40,55,71,86]
[0,16,42,56,70,84]
[5,12,49,69,82]
,

你可以这样做:

  • 卡片由 3 行组成。
  • 每行包含 9 个随机单元格:5 填充和 4 空心。
  • 列范围:1-9 首、80-90 末、x0-x9 其他。
  • 每列中没有重复的数字。
List<int[]> card = new ArrayList<>();
IntStream.range(0,3)
        // prepare a list of cell indices of the row
        .mapToObj(row -> IntStream.range(0,9)
                .boxed().collect(Collectors.toList()))
        // random order of cell indices
        .peek(Collections::shuffle)
        // list of 5 random cell indices in the row
        .map(list -> list.subList(0,5))
        // fill the cells with random numbers
        .map(list -> IntStream.range(0,9)
                // if this cell is in the list,then fill
                // it with a random number,otherwise 0
                .map(i -> {
                    int number = 0;
                    if (list.contains(i)) {
                        // unique numbers in each column
                        boolean isPresent;
                        do {
                            // [1-9] first,[80-90] last,[x0-x9] others
                            number = (int) ((i > 0 ? i * 10 : 1)
                                    + Math.random()
                                    * (i < 8 ? (i > 0 ? 10 : 9) : 11));
                            isPresent = false;
                            for (int[] row : card)
                                if (row[i] == number)
                                    isPresent = true;
                        } while (isPresent);
                    }
                    return number;
                }).toArray())
        // add this row to the card
        .forEach(card::add);
// output
card.stream()
        // row of numbers to string
        .map(row -> Arrays.stream(row)
                .mapToObj(j -> j == 0 ? "  " : String.format("%2d",j))
                // concatenate cells into one row
                .collect(Collectors.joining(" | ","| "," |")))
        .forEach(System.out::println);

输出:

|  7 | 20 |    |    | 47 | 53 |    |    | 86 |
|    |    | 27 | 38 |    |    | 63 | 80 | 85 |
|  4 |    | 26 |    |    |    | 69 | 77 | 81 |

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。