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

Java函数——如何将数组中的元素随机排序?

发布时间:2023-06-23 02:28:33

在Java中,有一种经典的算法可以随机打乱数组中的元素,称为Fisher–Yates shuffle(也称为Knuth shuffle)。以下是一个实现示例:

public static void shuffle(int[] arr) {
    Random rand = new Random();
    for (int i = arr.length - 1; i > 0; i--) {
        int j = rand.nextInt(i + 1);
        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }
}

这个算法的思想是从数组末尾开始,每次随机选择一个位置j(0 <= j <= i),将位置i的元素和位置j的元素交换。这样,每次交换后,位置i以后的元素都是随机排列的。重复这个过程直到数组的 个元素,整个数组就被随机排列了。

这个算法的时间复杂度是O(n),其中n是数组的长度。随机数生成器的性能取决于具体的实现,但通常不会成为瓶颈。

要注意的是,这个算法只适用于数组,不适用于集合类。对于集合类,应该先将其转换为数组,再使用相同的算法。

另外,如果要求数组中的每个元素出现概率相等,则需要保证随机数生成器能够生成所有可能的下标。这意味着,如果数组长度超过了随机数生成器的范围(如Random.nextInt(int n)中的n),则会引发偏差。解决方案是使用更高质量的随机数生成器,或者使用更复杂的算法(如Durstenfeld shuffle)。