从card[51]开始扁历,把当前的card 与card[rand.nextInt(51)]交换,遍历一次后,也就随机得差不多了 对于52张牌,实现一个随机打算扑克牌顺序的程序。52张牌使用 int 数组模拟。 该算法的难点是如何保证随机性?有个经典算法shuffle,思路就是遍历数组,在剩下的元素里再随机取一个元素,然后再在剩下的元素里再随机取一个元素。每次取完元素后,我们就不会让这个元素参与下一次的选取。 1 2 3 4 To shuffle an array a of n elements (indices 0..n -1): for i from n − 1 downto 1 do j ← random integer with 0 ≤ j ≤ i exchange a[j] and a[i] 注意这儿是0 ≤ j ≤ i,包括j=i的情况,因为可能洗牌后某个牌未发生交换,比如第51张牌还是原来的第51张牌。 1 2 3 4 5 6 7 8 9 10 11 public void randomCards() { int[] data = new int[ 52]; Random random= new Random(); for ( int i = 0; i < data.length; i++) data[i] = i; for ( int i = data.length - 1; i > 0; i--) { int temp = random.nextInt(i+ 1); //产生 [0,i] 之间的随机数 swap(data,i,temp); } }