java - 用 Java 洗牌

标签 java algorithm duplicates shuffle

<分区>

我已经阅读了很多关于该主题的内容,但我仍然对此心存疑虑。 请帮忙!

我创建了一副 52 张牌:

int[] deck = new int[52]; 
for (int i = 0; i < deck.length; i++) {deck[i] = 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;
}

然而,我在这里遇到的问题是,有时我可能会得到重复的;结果,一些卡片/值完全丢失了。

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

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

screenshot 1

screenshot 2

最佳答案

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

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());
    }
}

或者只使用Collections.shuffle():

import java.util.ArrayList;
import java.util.Collections;

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);
        }

        Collections.shuffle(deck);

        System.out.println(deck);
    }
}

关于java - 用 Java 洗牌,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39557701/

相关文章:

java - Struts 中的文件下载开始事件

c++ - 具有可变地形的 2D 静态盒碰撞

algorithm - 计算两个经纬度点之间的距离? (哈弗斯公式)

使用二分搜索检查排序的非顺序数组是否有重复项?

php - MYSQL 即使使用 DISTINCT 也加入重复结果

java - @Transient 在 JPA 中无法正常工作

java - 从 onPostExecute 显示到另一个 Activity json 数组结果

java - 使用 requestInterceptor 改造基本身份验证

c# - 从 7 张牌中选出最好的一手牌(德州扑克)

sql - 从 SQL 表中删除重复行(基于多列中的值)