It's our wits that make us men.

洗牌算法优化

Posted on By eatMelon-Masses

洗牌算法定义

给你一副扑克牌,让你尽可能打乱排的顺序,你会如何操作?

  1. 初始化两个数组长度为54,一个用来放未打乱的牌,一个用来放洗好的牌。
  2. 利用随机函数,每次从未打乱的牌数组中随机生成一个小于牌组长度54的整数,把选中的牌移动到洗好牌的数组中(依次从小到大排列)。
  3. 如果随机数刚好是之前已经移动过的牌的位置,继续执行洗牌操作,直到所有牌都移到洗牌数组中。

    问题:

    随机函数可能会生成之前已经移动过牌的位置,需要重复洗牌,效率低。

解决思路

1.只用一个数组,每次洗牌,把选中的数和数组最后一个未洗过牌位置的牌位置交换,这样每次就可以缩小随机函数边界,同时也能保证随机函数范围内的位置永远是没有洗过的牌。

    int[] shuffle(int[] cards) {
        Random random = new Random();
        int index ;
        int temp ;
        for (int i = cards.length - 1; i > 0; i--) {
            index = random.nextInt(i);
            temp = cards[index];
            cards[index] = cards[i];
            cards[i] = temp;
        }
        return cards;
    }