在其他语言中有随机混合数组元素的函数(比如PHP的shuffle函数),在Java的情况下不知道有没有类似的函数,所以目前看到的函数为此目的从代码创建。
很多页面(比如官方英文网站)提供了可以解决问题的功能代码,但是找到的一些解决方案似乎有些过时了。
很多时候,即使是在互联网上流传的答案也不是完全有效的,也不是 100% 有效。
所寻求的是该算法可以:
- 随机播放包含任何类型元素(字符、数字、字符串、数组等)的数组。
- 这可以对任何大小的数组进行排序。
- 并且结果具有可接受的熵(无序)程度。
这是java中的代码示例
private static void shuffleArray(int[] array)
{
int index;
Random random = new Random();
for (int i = array.length - 1; i > 0; i--)
{
index = random.nextInt(i + 1);
if (index != i)
{
array[index] ^= array[i];
array[i] ^= array[index];
array[index] ^= array[i];
}
}
}
从数组的随机洗牌获得的代码
如何使用更短的代码和更少的行对任何类型的数组进行排序,而不管它包含的元素的大小和类型如何?
谢谢。
首先,让我们来解决洗牌算法的问题。您可以使用“就地”工作且具有 O(N) 复杂度的算法是 Knut 的算法,您可以在此处查看。这是逐步算法:
i
对于从0
到的每个站点N
:j
之间选择一个随机数0
N
i
和j
然后,关于如何洗牌任何数据类型的问题,您应该熟悉Java 中的泛型主题。
您可以使用满足这两个要求的实现如下:
该函数
swap
交换数组中的数字,而该函数shuffle
循环遍历元素并生成随机数。参数
<T>
允许这些函数支持任何类型的对象,要使用它们,您可以<T>
在返回类型之前添加它们,然后T
在参数或函数体中使用该类型。但请注意,泛型不适用于int
or等原始类型char
,因此数组必须是Integer
,String
等类型。将数组转换为
List
您有该类的shuffle方法,该方法
Collections
允许您使用随机默认源对指定列表进行随机播放。您可以在java-shuffle-collection中看到更多使用示例
https://www.programcreek.com/2012/02/java-method-to-shuffle-an-int-array-with-random-order/你可以找到更详细的信息。
例如,我有一个用 Java 制作的应用程序,当它启动时,会随机显示一个背景图像,我就是这样做的。
这样,每当我打开应用程序时,它都会加载不同的图像。