gpt4 book ai didi

java - 在 for 循环中交换整数数组值 - 这可能吗?

转载 作者:行者123 更新时间:2023-12-01 22:30:00 25 4
gpt4 key购买 nike

所以我决定创建一个简单的卡片组洗牌程序,没有什么特别的只是一个包含 52 张编号从 0 到 52 的“卡片”的数组。我不确定这是否是最好的方法。

我创建了一个随机整数方法 (randInt) 来获取随机数,并创建了一个洗牌方法 (shuffle) 来获取两张随机卡片并交换它们的值。

我的方法很简单,但是当我运行代码(以及我添加的一些调试代码)时,我似乎让每个值都变成了完全相同的值 (d[2] = d[1] = randCard1),这导致了倍数同一张卡,显然其他值完全消失。如果洗牌次数足够多,整副牌可能会变成 52 张全部由相同值组成的牌。

我已经阅读了一些关于交换整数数组的问题,但我的问题是不同的,因为它是关于使用 for 循环的问题,(因为我交换数组值的方法已经与那些问题相似,但 final/static 关键字不是当我修改几次时很有帮助我得出结论是 for 循环是罪魁祸首)这显然会阻止数组正确更新。

如果是这样,我该如何克服这个问题?如果不是,我错过了什么?我交换整数数组值的方式还有其他问题吗?

这是我的代码:

import java.util.Random;

public class Cards {

public static void main(String[] args) {

int[] deck = new int[] {
0, 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, 26, 27, 28, 29,
30, 31, 32, 33, 34, 35, 36, 37, 38, 39,
40, 41, 42, 43, 44, 45, 46, 47, 48, 49,
50, 51
};

printArray(deck, "Original Deck:");
deck = shuffle(deck);
printArray(deck, "Shuffled Deck:");
}

public static int[] shuffle(int[] d) {
//shuffle between 100 to 200 to ensure a thorough shuffle
int randLoops = randInt(100, 200);
int randCard1;
int randCard2;

for (int i = 0; i <= randLoops; i++) {
int temp;

randCard1 = randInt(0, 51);

do {randCard2 = randInt(0, 51);}
while (randCard2 == randCard1);

System.out.print("*" + randCard1 + "|" + randCard2 + "/");
temp = randCard1;
d[randCard1] = d[randCard2];
d[randCard2] = d[temp];
System.out.println(d[randCard1] + "|" + d[randCard2] + "*");
}
return d;
}

public static int randInt(int min, int max) {
Random rand = new Random();
int randomNum = rand.nextInt((max - min) + 1) + min;

return randomNum;
}

public static void printArray(int[] d, String t) {
System.out.println(t);
for (int i = 0; i < d.length; i++) {
System.out.print(d[i] + ", ");
}

System.out.println();
}
}

下面是我的调试代码输出示例(希望它能有所帮助而不是阻碍):

Original Deck:
0, 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, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51,
*40|41/41|41*
*29|40/41|41*
*19|26/26|26*
*2|27/27|27*
*4|30/30|30*
*24|25/25|25*
*7|1/1|1*
*17|47/47|47*
*14|5/5|5*
*42|11/11|11*
*23|42/11|11*
*33|30/30|30*
*19|42/9|9*
*11|26/9|9*
*40|21/9|9*
*36|11/9|9* <--------- at the end I don't know why the values = 9?
Shuffled Deck:
9, 11, 30, 11, 30, 30, 31, 45, 11, 11, 51, 9, 11, 45, 45, 45, 51, 11, 9, 9, 44, 9, 30, 44, 27, 11, 9, 27, 31, 11, 11, 21, 11, 11, 45, 35, 9, 11, 11, 30, 9, 11, 9, 11, 21, 31, 9, 30, 45, 30, 11, 45,
BUILD SUCCESSFUL (total time: 2 seconds)

最佳答案

这就是问题所在:

temp = randCard1;
d[randCard1] = d[randCard2];
d[randCard2] = d[temp];

您不是在 temp 中保存卡片值,而是在保存它的索引。相反,你需要

temp = d[randCard1];
d[randCard1] = d[randCard2];
d[randCard2] = temp;

注意JDK有一个shuffle方法:

// create the deck
Integer[] deck = new Integer[52];
for (int i = 0; i < deck.length; i++) {
deck[i] = i;
}

// shuffle it
Collections.shuffle(Arrays.asList(deck));

关于java - 在 for 循环中交换整数数组值 - 这可能吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29929002/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com