用Java洗牌

用Java洗牌,java,algorithm,duplicates,shuffle,Java,Algorithm,Duplicates,Shuffle,关于这个话题,我读了很多东西,但我仍然有疑虑。 求求你,救命 我创建了一副52张卡片: int[] deck = new int[52]; for (int i = 0; i < deck.length; i++) {deck[i] = i;} int[]deck=newint[52]; 对于(inti=0;i

关于这个话题,我读了很多东西,但我仍然有疑虑。 求求你,救命

我创建了一副52张卡片:

int[] deck = new int[52]; 
for (int i = 0; i < deck.length; i++) {deck[i] = i;}
int[]deck=newint[52];
对于(inti=0;i
现在,我想正确地洗牌,而不是遵循任何模式或函数

我将在算法中使用Math.random()方法:

for (int i = 0; i < deck.length; i++) {
    int j = (int)(Math.random() * deck.length); // Get a random index out of 52
    int temp = deck[i]; // Swap the cards
    deck[i] = deck[j];
    deck[j] = temp;
}
for(int i=0;i
然而,我在这里遇到的问题是,有时我可能会得到重复的;因此,一些卡/值完全丢失

我几乎可以肯定,我没有放弃我已经使用过的索引/值,这可能是上述问题的核心。但是我该怎么做呢

有什么建议吗?可能是按照我的思路。非常感谢


请查看这是否有帮助:

boolean init[] = new boolean[52];
Random r = new Random();

int getNextCard(){
    int i = r.nextInt(52);
    while(init[i])
        i = r.nextInt(52);
    init[i] = true;
    return i;
}

void shuffleCards() {   

    int[] deck = new int[52];
    for (int i = 0; i < deck.length; i++) {
        deck[i] = getNextCard();
    }
    System.out.println(Arrays.toString(deck));
}
boolean init[]=new boolean[52];
随机r=新随机();
int getNextCard(){
int i=r.nextInt(52);
while(init[i])
i=r.nextInt(52);
init[i]=真;
返回i;
}
void shuffleCards(){
int[]甲板=新int[52];
对于(int i=0;i

其思想是使用
随机
生成一个介于0和52之间的随机数。一旦取下一个数字,我们将在布尔数组
init
中将其标记为已取。因此,下次出现相同的数字时,我们将再次生成随机数,直到得到一个尚未取下的数字。

请查看这是否有帮助:

boolean init[] = new boolean[52];
Random r = new Random();

int getNextCard(){
    int i = r.nextInt(52);
    while(init[i])
        i = r.nextInt(52);
    init[i] = true;
    return i;
}

void shuffleCards() {   

    int[] deck = new int[52];
    for (int i = 0; i < deck.length; i++) {
        deck[i] = getNextCard();
    }
    System.out.println(Arrays.toString(deck));
}
boolean init[]=new boolean[52];
随机r=新随机();
int getNextCard(){
int i=r.nextInt(52);
while(init[i])
i=r.nextInt(52);
init[i]=真;
返回i;
}
void shuffleCards(){
int[]甲板=新int[52];
对于(int i=0;i

其思想是使用
随机
生成一个介于0和52之间的随机数。一旦取下一个数字,我们将在布尔数组
init
中将其标记为已取。因此,下一次出现相同的数字时,我们将再次生成随机数,直到得到一个尚未取下的数字。

只需为洗牌卡使用一个新数组,并使用从先前数组中移除的随机卡填充即可

import java.util.ArrayList;

public class Test {
    private static final int DECK_SIZE = 52;

    public static void main(String args[]) {
        ArrayList<Integer> deck = new ArrayList<Integer>();

        for (int i = 0; i < DECK_SIZE; ++i) {
            deck.add(i);
        }

        ArrayList<Integer> shuffledDeck = new ArrayList<Integer>();

        while (deck.size() > 0) {
            int index = (int) (Math.random() * deck.size());
            shuffledDeck.add(deck.remove(index));
        }

        System.out.println(shuffledDeck.toString());
    }
}

只需为洗牌的牌使用一个新的阵列,并使用从先前阵列中移除的随机牌填充它

import java.util.ArrayList;

public class Test {
    private static final int DECK_SIZE = 52;

    public static void main(String args[]) {
        ArrayList<Integer> deck = new ArrayList<Integer>();

        for (int i = 0; i < DECK_SIZE; ++i) {
            deck.add(i);
        }

        ArrayList<Integer> shuffledDeck = new ArrayList<Integer>();

        while (deck.size() > 0) {
            int index = (int) (Math.random() * deck.size());
            shuffledDeck.add(deck.remove(index));
        }

        System.out.println(shuffledDeck.toString());
    }
}


什么的复制品?j的重复值?我和j?什么?我随机生成和/或已分配的副本您能给我们展示一个输出副本的示例吗?代码中似乎没有任何会生成重复项的错误。所以,也许你测试重复数据的方法是错误的。当你生成随机数时,你会得到重复数据。洗牌时没有问题。
牌组
应该是一个
列表
,然后你可以只
集合。洗牌()
它。什么的副本?j的重复值?我和j?什么?我随机生成和/或已分配的副本您能给我们展示一个输出副本的示例吗?代码中似乎没有任何会生成重复项的错误。所以,也许你测试重复数据的方法是错误的。当你生成随机数时,你会得到重复数据。洗牌时没有问题。
牌组
应该是一个
列表
,然后你可以只
集合。洗牌()
它。这不是洗牌,这是重新填充。但这会生成一个洗牌集对吗?是的,顺序不同。但这不是问题。据我所知,他的洗牌方法会导致重复,因此会丢失一些其他值,我在代码中向他展示了一种不会导致重复的方法谢谢你的帮助!这不是洗牌,这是重新填充。但这会生成一个洗牌集,对吗?没错,顺序不同。但这不是问题。据我所知,他的洗牌方法会导致重复,因此会丢失一些其他值,我在代码中向他展示了一种不会导致重复的方法谢谢你的帮助!谢谢你的帮助!谢谢你的帮助!