Java: создать массив со случайными значениями типа int (значения типа int могут использоваться только один раз) - PullRequest
1 голос
/ 29 октября 2011

У меня есть массив с именем 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 ]

11 голосов
/ 29 октября 2011

Используйте ArrayList и заполните его номерами от 1 до 15.

Перемешайте список.

Преобразуйте его в массив .

7 голосов
/ 29 октября 2011

Это похоже на домашнюю работу (или вопрос интервью?).Если это так, и вам необходимо использовать массивы, а не встроенные методы с объектами коллекции Java (или даже если это не так, на самом деле), ответом является алгоритм Фишера-Йейтса 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]

(я должен проверить, но я подозреваю, что именно это 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;
}
6 голосов
/ 29 октября 2011

Сделай вот так

// 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);
}
0 голосов
/ 29 октября 2011

Я сделаю что-то вроде этого:

Сначала создайте временный массив, заполненный числами от начала до конца, затем, используя случайный выбор номера, скопируйте его в массив и удалите из временного массива, повторяйте доМассив пуст ...

    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++;
    }   
0 голосов
/ 29 октября 2011

Это оставит элементы случайным образом перемешанными в 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]);
...