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

gie*_*ops 1 java sorting random algorithm

我有一个名为的数组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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

谢谢!:)

Mar*_*elo 11

使用ArrayList并用数字1到15填充它.

洗牌清单.

将其转换为数组.


Bri*_*ach 7

这看起来像是家庭作业(或面试问题?).如果是这种情况,并且您需要使用数组而不是使用Java Collection Objects的内置方法(或者即使不是,实际上),答案是Fisher-Yates Shuffle算法

现代的就地洗牌是:

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]
Run Code Online (Sandbox Code Playgroud)

(我必须检查,但我怀疑这是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();


}
Run Code Online (Sandbox Code Playgroud)

并且......这可以使用内部版本的算法进一步优化,因为您希望以随机顺序插入已知的一系列数字.以下是实现您所要做的事情的最佳方式,因为没有创建额外的副本,例如创建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;
}
Run Code Online (Sandbox Code Playgroud)


Luk*_*der 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);
}
Run Code Online (Sandbox Code Playgroud)