import java.util.Random;
public class Shuffle {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] arr = new int[54];
int i;
for(i = 0; i < 54; i++){
arr[i] = i;
}
shuffle_insert(arr);
for(i=0;i<54;i++){
System.out.print(arr[i]+" ");
}
}
/*
* 每次随机生成两个位置互换(在若干次互换后可能还有一些位置没有被换掉)
*/
private static void shuffle_swap(int[] arr){
int i,temp;
Random rd=new Random();
for(i=0;i<100;i++){
int ran1=rd.nextInt(54);
int ran2=rd.nextInt(54);
temp=arr[ran1];
arr[ran1]=arr[ran2];
arr[ran2]=temp;
}
}
/*
* 每次随机生成一个位置,与第i张牌互换
*/
private static void shuffle_swap1(int[] arr){
int i,temp;
Random rd=new Random();
for(i = 0; i < 54; i++){
int ran=rd.nextInt(54);
temp=arr[i];
arr[i]=arr[ran];
arr[ran]=temp;
}
}
/*
* 从第一张牌开始插入,每张牌随机插入其之前的牌中,但是为了避免每次插入都导致之后的
* 位置后移,可以将待插入的牌放在最后,然后与其之前任意位置的牌互换
*/
private static void shuffle_insert(int[] arr){
int i,temp;
Random rd=new Random();
for(i=1;i<54;i++){
temp=rd.nextInt(i);
arr[i]=arr[temp];
arr[temp]=i;
}
}
}
个人比较喜欢第二种算法,即每次随机生成一个位置,与第i张牌互换,这个的随机性也最好。