洗牌可以抽象为:给定一组排列,输出该排列的一个随机组合

算法一:

实现语言:Java

package com.test.demo;

import java.util.Random;
import java.util.Scanner;

/*
Fisher–Yates随机置乱算法也被称做高纳德置乱算法,通俗说就是生成一个有限集合的随机排列。
Fisher-Yates随机置乱算法是无偏的,所以每个排列都是等可能的,当前使用的Fisher-Yates随机置乱算法是相当有效的,需要的时间正比于要随机置乱的数,不需要额为的存储空间开销。
 */
public class FisherYatesShuffle {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int[] arr = null;
        if (n > 0) {
            arr = new FisherYatesShuffle().fisherYatesShuffle(n);
        }
        for (int i = 0; i < n; ++i) {
            System.out.print(arr[i] + " ");
        }
    }

    public int[] fisherYatesShuffle(int n) {
        if (n <= 0) {
            return null;
        }
        int[] arr = new int[n];
        //初始的有序数组
        for (int i = 0; i < 10; ++i) {
            arr[i] = i + 1;
        }
        //费雪耶兹置乱算法:每次生成的随机交换位置:
        for (int i = n - 1; i > 0; --i) {
            //随机数生成器,范围[0, i] 
            int rand = (new Random()).nextInt(i + 1);
            int tmp = arr[i];
            arr[i] = arr[rand];
            arr[rand] = tmp;
        }
        return arr;
    }
}