洗牌可以抽象为:给定一组排列,输出该排列的一个随机组合
算法一:
实现语言: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;
}
}