我需要随机洗牌以下数组:
int[] solutionArray = {1, 2, 3, 4, 5, 6, 6, 5, 4, 3, 2, 1};
有什么函数可以做到吗?
我需要随机洗牌以下数组:
int[] solutionArray = {1, 2, 3, 4, 5, 6, 6, 5, 4, 3, 2, 1};
有什么函数可以做到吗?
当前回答
你应该使用Collections.shuffle()。但是,不能直接操作原始类型数组,因此需要创建包装器类。
试试这个。
public static void shuffle(int[] array) {
Collections.shuffle(new AbstractList<Integer>() {
@Override public Integer get(int index) { return array[index]; }
@Override public int size() { return array.length; }
@Override public Integer set(int index, Integer element) {
int result = array[index];
array[index] = element;
return result;
}
});
}
And
int[] solutionArray = {1, 2, 3, 4, 5, 6, 6, 5, 4, 3, 2, 1};
shuffle(solutionArray);
System.out.println(Arrays.toString(solutionArray));
输出:
[3, 3, 4, 1, 6, 2, 2, 1, 5, 6, 5, 4]
其他回答
Random rnd = new Random();
for (int i = ar.length - 1; i > 0; i--)
{
int index = rnd.nextInt(i + 1);
// Simple swap
int a = ar[index];
ar[index] = ar[i];
ar[i] = a;
}
顺便说一下,我注意到这段代码返回了一个ar.length - 1个数的元素,所以如果你的数组有5个元素,新的打乱的数组将有4个元素。这是因为for循环说i>0。如果你改变为i>=0,你得到所有的元素洗牌。
我在一些答案中看到了一些遗漏的信息,所以我决定添加一个新的。
Java集合数组。asList接受类型为T的var-arg (T…)。如果传递一个基元数组(int array), asList方法将推断并生成一个List<int[]>,这是一个单元素列表(其中一个元素是基元数组)。如果你洗牌这个元素列表,它不会改变任何东西。
首先,你需要将原始数组转换为Wrapper对象数组。为此,您可以使用ArrayUtils。apache.commons.lang中的一个对象方法。然后将生成的数组传递给一个List,最后洗牌。
int[] intArr = {1,2,3};
List<Integer> integerList = Arrays.asList(ArrayUtils.toObject(array));
Collections.shuffle(integerList);
//now! elements in integerList are shuffled!
下面是一个使用Apache Commons Math 3的解决方案。X(仅适用于int[]数组):
MathArrays.shuffle(array);
http://commons.apache.org/proper/commons-math/javadocs/api-3.6.1/org/apache/commons/math3/util/MathArrays.html shuffle (int [])
另外,Apache Commons Lang 3.6为ArrayUtils类引入了新的shuffle方法(用于对象和任何基本类型)。
ArrayUtils.shuffle(array);
http://commons.apache.org/proper/commons-lang/javadocs/api-release/org/apache/commons/lang3/ArrayUtils.html#shuffle-int:A-
看看Collections类,特别是shuffle(…)。
这是knuth shuffle算法。
public class Knuth {
// this class should not be instantiated
private Knuth() { }
/**
* Rearranges an array of objects in uniformly random order
* (under the assumption that <tt>Math.random()</tt> generates independent
* and uniformly distributed numbers between 0 and 1).
* @param a the array to be shuffled
*/
public static void shuffle(Object[] a) {
int n = a.length;
for (int i = 0; i < n; i++) {
// choose index uniformly in [i, n-1]
int r = i + (int) (Math.random() * (n - i));
Object swap = a[r];
a[r] = a[i];
a[i] = swap;
}
}
/**
* Reads in a sequence of strings from standard input, shuffles
* them, and prints out the results.
*/
public static void main(String[] args) {
// read in the data
String[] a = StdIn.readAllStrings();
// shuffle the array
Knuth.shuffle(a);
// print results.
for (int i = 0; i < a.length; i++)
StdOut.println(a[i]);
}
}