洗牌算法定义
给你一副扑克牌,让你尽可能打乱排的顺序,你会如何操作?
- 初始化两个数组长度为54,一个用来放未打乱的牌,一个用来放洗好的牌。
- 利用随机函数,每次从未打乱的牌数组中随机生成一个小于牌组长度54的整数,把选中的牌移动到洗好牌的数组中(依次从小到大排列)。
- 如果随机数刚好是之前已经移动过的牌的位置,继续执行洗牌操作,直到所有牌都移到洗牌数组中。
问题:
随机函数可能会生成之前已经移动过牌的位置,需要重复洗牌,效率低。
解决思路
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;
}