欢迎访问宙启技术站
智能推送

实现完美洗牌的10个Java函数

发布时间:2023-05-23 20:35:44

1. Fisher–Yates shuffle 算法

Fisher-Yates 算法也被称为 Knuth-Shuffle 算法,是一种无偏的洗牌算法。它的实现如下:

public static void fisherYatesShuffle(int[] arr) {
    Random rand = ThreadLocalRandom.current();
    for (int i = arr.length - 1; i > 0; i--) {
        int j = rand.nextInt(i + 1);
        swap(arr, i, j);
    }
}

private static void swap(int[] arr, int i, int j) {
    int temp = arr[i];
    arr[i] = arr[j];
    arr[j] = temp;
}

2. Knuth shuffle 算法

Knuth shuffle 算法也是一种无偏的洗牌算法。它的实现如下:

public static void knuthShuffle(int[] arr) {
    Random rand = ThreadLocalRandom.current();
    for (int i = 0; i < arr.length; i++) {
        int j = rand.nextInt(i + 1);
        swap(arr, i, j);
    }
}

private static void swap(int[] arr, int i, int j) {
    int temp = arr[i];
    arr[i] = arr[j];
    arr[j] = temp;
}

3. Durstenfeld shuffle 算法

Durstenfeld 算法是 Fisher-Yates 算法的一种变体,它将交换操作移到了循环的起始处。它的实现如下:

public static void durstenfeldShuffle(int[] arr) {
    Random rand = ThreadLocalRandom.current();
    for (int i = arr.length - 1; i > 0; i--) {
        int j = rand.nextInt(i + 1);
        if (i != j) {
            swap(arr, i, j);
        }
    }
}

private static void swap(int[] arr, int i, int j) {
    int temp = arr[i];
    arr[i] = arr[j];
    arr[j] = temp;
}

4. Collections shuffle() 方法

Java 的标准库提供了一个实现洗牌的方法 Collections.shuffle(),它的实现如下:

public static void collectionsShuffle(List<?> list) {
    Random rand = ThreadLocalRandom.current();
    for (int i = list.size() - 1; i > 0; i--) {
        int j = rand.nextInt(i + 1);
        Collections.swap(list, i, j);
    }
}

5. Apache Commons Collections shuffle() 方法

Apache Commons Collections 是 Apache 基金会的一个开源项目,提供了一系列实用的工具类和数据结构。它的 shuffle() 方法实现了洗牌操作:

public static void apacheShuffle(List<?> list) {
    Random rand = ThreadLocalRandom.current();
    Collections.shuffle(list, rand);
}

6. Guava shuffle() 方法

Guava 是 Google 的一个开源项目,它的 shuffle() 方法实现了洗牌操作:

public static void guavaShuffle(List<?> list) {
    Random rand = ThreadLocalRandom.current();
    Collections.shuffle(list, rand);
}

7. Math.random() 方法

Math.random() 是 Java 标准库提供的一个随机数生成方法,它可以用来实现洗牌操作:

public static void mathRandomShuffle(int[] arr) {
    for (int i = arr.length - 1; i > 0; i--) {
        int j = (int)(Math.random() * (i + 1));
        swap(arr, i, j);
    }
}

private static void swap(int[] arr, int i, int j) {
    int temp = arr[i];
    arr[i] = arr[j];
    arr[j] = temp;
}

8. SecureRandom 方法

SecureRandom 是 Java 标准库提供的一个安全的随机数生成器,它可以用于实现洗牌操作:

public static void secureRandomShuffle(int[] arr) {
    SecureRandom rand = new SecureRandom();
    for (int i = arr.length - 1; i > 0; i--) {
        int j = rand.nextInt(i + 1);
        swap(arr, i, j);
    }
}

private static void swap(int[] arr, int i, int j) {
    int temp = arr[i];
    arr[i] = arr[j];
    arr[j] = temp;
}

9. XORShift 算法

XORShift 算法是一种高效的伪随机数生成算法,可以用于实现洗牌操作:

public static void xorShiftShuffle(int[] arr) {
    int seed = (int) System.currentTimeMillis();
    for (int i = arr.length - 1; i > 0; i--) {
        seed ^= (seed << 13);
        seed ^= (seed >>> 17);
        seed ^= (seed << 5);
        int j = seed % (i + 1);
        if (j < 0) j += (i + 1);
        swap(arr, i, j);
    }
}

private static void swap(int[] arr, int i, int j) {
    int temp = arr[i];
    arr[i] = arr[j];
    arr[j] = temp;
}

10. Mersenne Twister 算法

Mersenne Twister 算法是一种高效而准确的伪随机数生成算法,可以用于实现洗牌操作:

public static void mersenneTwisterShuffle(int[] arr) {
    MersenneTwister rand = new MersenneTwister();
    for (int i = arr.length - 1; i > 0; i--) {
        int j = rand.nextInt(i + 1);
        swap(arr, i, j);
    }
}

private static void swap(int[] arr, int i, int j) {
    int temp = arr[i];
    arr[i] = arr[j];
    arr[j] = temp;
}