Java:用随机int创建数组(int只能使用一次)

时间:2011-10-29 17:20:30

标签: java algorithm random sorting

我有一个名为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;
        }
    }
}

谢谢! :)

5 个答案:

答案 0 :(得分:11)

使用ArrayList并填写数字1到15。

Shuffle列表。

将其转换为array

答案 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++;
    }