洗牌算法怎样才够乱?
一副扑克54张牌,有54!种排列方式。你所给出的洗牌算法,应该能够等概率地生成这54!种结果中的一种。
一般方法:
1.利用一个List
2.每次从数组中,随机找到一个数;若该数没有被选择过,那么就将它放入List中;如果被选择过,就重新随机
3.时间复杂度O(n*n)
优化洗牌算法:
从数组的最后一个数(下标为i)开始,进行随机取当前元素之前的数。将得到的下标对应的元素和最后一个数交换,将最后一个数不在视为数组中的元素,继续循环。直到只剩下第一个元素为止
package com.lyf.practice;
import java.util.Random;
/**
* Created by fangjiejie on 2018/5/23.
*/
public class Xipai {
public static void main(String[] args) {
int a[]=new int[]{1,2,3,4,5,6,7,8,9};
int b[]=shuffe(a,9);
for(int k:b){
System.out.print(k+",");
}
}
public static int[] shuffe(int a[],int n){
Random rand=new Random();
for(int i=n-1;i>0;i--){
int tmp=rand.nextInt(i);
swap(a,i,tmp);
}
return a;
}
private static void swap(int[] a, int i, int i1) {
int tmp=a[i];
a[i]=a[i1];
a[i1]=tmp;
}
}