如何解决二维数组随机索引乐透游戏
我正在尝试做一个乐透游戏,我必须生成一张随机卡片,第一列中的数字从 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 举报,一经查实,本站将立刻删除。