我知道通常的洗牌方式列表;
是否有另一种模仿shuffle为Array(NOT Lists)做的方法?
我已编写适用于rand.NextInt
和IF
以及while
的内容的代码;
但我非常怀疑这是最有效的方式。
任何考虑低资源的想法?
static int[] order = new int[] {1,2,3,4};
static int[] order2 = new int[] {0,0,0,0,0};
static int p;
Random rand = new Random();
int m=global.order[rand.nextInt( global.order.length)];
global.order2[m]=m;
int n=global.order[rand.nextInt( global.order.length)];
while ( m==n ) { n=global.order[rand.nextInt( global.order.length)];}
global.order2[n]=n;
int o=global.order[rand.nextInt( global.order.length)];
while (m==o || n==o) { o=global.order[rand.nextInt( global.order.length)]; }
global.order2[o]=o;
for (int y=1; y<=4; y++){
if (global.order2[y]!=m && global.order2[y]!=n && global.order2[y]!=o){
global.order2[y]=y;
global.p=y;
答案 0 :(得分:1)
使用Fisher-Yates shuffle(Wikipedia)
您可以轻松地遵循本指南来创建自己的Java实现:
r
[0..array.length)
array[0]
和array[r]
r
[1..array.length)
array[1]
和array[r]
等等。这很容易转换为循环。性能良好,无需重新分配数组或线性创建新对象和执行时间。
答案 1 :(得分:0)
如果您需要的是带有随机生成值的未排序集,请考虑使用HashSet。
要使用普通数组实现此操作,您在数组中的插入将需要O(n)
时间,因为您需要查看所有元素以查看它是否已包含随机数。使用HashSet
插入将O(1)
。然后,您可以将其转换为数组。
import java.util.Arrays;
import java.util.HashSet;
public class MakeUnsortedSet {
public static void main(String[] args) {
HashSet<Integer> set = new HashSet<>();
while (set.size() < 10) {
set.add((int)(Math.random() * 20));
}
Integer[] ints = new Integer[10];
set.toArray(ints);
System.out.println(Arrays.toString(ints));
}
}
答案 2 :(得分:0)
实质上,ArrayList
只是List
接口实现中的常规数组。如果您认为自己可以提出更好的实施方案以满足您的绩效需求,只需实施自己的List
并将其传递给Collections.shuffle()
。
如果你想避免为每个数组实例化List
实现的新对象,你可以用这样的方式实现它,你只能替换对包装数组的引用并进行微小的修改。
无论如何,在尝试重新发明轮子之前,我会首先查看ArrayList
的源代码(可能是extends
)。