Hard 随机洗牌函数 @CareerCup

第i个元素和index在[i,length-1]之间的一个数随机交换


 

package Hard;



import CtCILibrary.AssortedMethods;





/**

 *

 * Write a method to shuffle a deck of cards. It must be a perfect shuffle - in other words, each 52! permutations of the deck has to be equally likely. Assume that you are given a random number generator which is perfect.



译文:



写一个随机洗牌函数。要求洗出的52!种组合都是等概率的。 也就是你洗出的一种组合的概率是1/(52!)。假设已经给你一个完美的随机数发生器。

 *

 */

public class S18_2 {

	/* Random number between lower and higher, inclusive */

    public static int rand(int lower, int higher) { 

            return lower + (int)(Math.random() * (higher - lower + 1));

    }        

    

    // 递归shuffle,先shuffle前i-1个元素,然后把第i个元素和前面的一个随机元素交换

    public static int[] shuffleArrayRecursively(int[] cards, int i) {

            if (i == 0) {

            	return cards;

            }

            

            /* shuffle elements 0 through index - 1 */

            shuffleArrayRecursively(cards, i - 1);

            int k = rand(0, i);                

            

            /* Swap element k and index */

            int temp = cards[k];

            cards[k] = cards[i];

            cards[i] = temp;

            

            /* Return shuffled array */

            return cards;

     }

   

    public static void swap(int[] a, int n, int m){

    	int tmp = a[n];

    	a[n] = a[m];

    	a[m] = tmp;

    }

    

    // 遍历数组,对每一个在index为i上的元素,和index在[i,n-1]之间的一个随机index选择的数交换

    public static void shuffleArrayInteratively(int[] cards) { 

    	for (int i = 0; i < cards.length; i++) { 

        	int k = rand(i, cards.length-1);		// 产生i到n-1间的随机数

            swap(cards, i, k);

        }

    }

    

    public static void main(String[] args) {

            int[] cards = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};

            System.out.println(AssortedMethods.arrayToString(cards));

            shuffleArrayInteratively(cards);

            System.out.println(AssortedMethods.arrayToString(cards));

    }

}


 

 

你可能感兴趣的:(UP)