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