我有一个名为arr
的数组,其中包含15个元素。
我需要将数字1到15以随机顺序放入该数组中。
这是我尝试过的:
int[] arr = new int[15];
int i,j,k,n;
for (i = 0; i<15; i++) {
for (j=0; j<15; j++) {
n = (int)(Math.random() * 14 + 1);
if (rij[j] != n) {
rij[i] = n;
break;
}
}
}
谢谢! :)
答案 0 :(得分:11)
答案 1 :(得分:7)
这似乎是家庭作业(或面试问题?)。如果是这种情况,并且您需要使用数组而不是使用Java Collection Objects的内置方法(或者即使不是,实际上),答案是Fisher-Yates Shuffle algorithm
现代的就地洗牌是:
To shuffle an array a of n elements (indexes 0..n-1):
for i from n − 1 downto 1 do
j ← random integer with 0 ≤ j ≤ i
exchange a[j] and a[i]
(我必须检查,但我怀疑这是Java在shuffle()
方法的引擎下使用的。)
编辑,因为实施算法很有趣:
在java中,这将是:
public static void main(String[] args) {
int[] a = new int[15];
for (int i = 1; i <= 15; i++)
{
a[i-1] = i;
}
Random rg = new Random();
int tmp;
for (int i = 14; i > 0; i--)
{
int r = rg.nextInt(i+1);
tmp = a[r];
a[r] = a[i];
a[i] = tmp;
}
for (int i = 0; i < 15; i++)
System.out.print(a[i] + " ");
System.out.println();
}
并且......这可以使用内部版本的算法进一步优化,因为您希望以随机顺序插入已知的一系列数字。 以下是实现您所说的想要做的最佳方式,因为没有创建额外的副本,例如创建ArrayList
并将其复制回数组。
a = new int[15];
Random rg = new Random();
for (int i = 0; i < 15; i++)
{
int r = rg.nextInt(i+1);
a[i] = a[r];
a[r] = i+1;
}
答案 2 :(得分:6)
这样做
// Create an ordered list
List<Integer> list = new ArrayList<Integer>();
for (int i = 1; i < 16; i++) {
list.add(i);
}
// Shuffle it
Collections.shuffle(list);
// Get an Integer[] array
Integer[] array1 = list.toArray(new Integer[list.size()]);
// Get an int[] array
int[] array2 = new int[list.size()];
for (int i = 0; i < list.size(); i++) {
array2[i] = list.get(i);
}
答案 3 :(得分:0)
这会使元素在Integer[]
中随机混乱,如果你没事的话:
List<Integer> list = new ArrayList<Integer>();
for (int i = 0; i < 15; i++)
list.add(i + 1);
Collections.shuffle(list);
Integer[] arr = list.toArray(new Integer[0]);
答案 4 :(得分:0)
我会做这样的事情:
首先创建一个从头到尾填充数字的临时arraylist,然后使用随机选择一个数字,将其复制到数组中并从temp arraylist中删除它,重复直到arraylist为空...
ArrayList<Integer> arr = new ArrayList<Integer>();
int[] arr2 = new int[15];
int i,j,k,n;
for (i=0;i<15;i++) arr.add(i+1);
i=0;
while(arr.size()>0){
n = (int)(Math.random() * (14 + 1 - i));
arr2[i]=arr.get(n);
arr.remove(n);
i++;
}