2016-11-09 3 views
0

Имея массив чисел, я хочу случайным образом выбрать каждый его индекс со случайным генератором. Какова наилучшая практика случайного генератора, чтобы избежать бесполезных циклов на уже выбранных индексах? До сих пор я использую ArrayList для хранения уже выбранных, но я чувствую, что в конечном итоге этот алгоритм будет иметь много запущенных циклов в конце. Вот такой код:Лучшая практика для случайного генератора Java

Random r = new Random(); 
ArrayList<Integer> found = new ArrayList<Integer>(); 
while(notAllPassed){ 
    int prediction = r.nextInt(sizeOfArray); 
    if(!found.contains(prediction){ 
     found.Add(prediction); 
     //Do stuff 
    } 
} 
+6

1. построить список индексов. 2. Перетасуйте список. –

+0

Чтобы немного рассказать о том, что сказал @MarkoTopolnik (в случае, если это не очевидно). Найдите алгоритм перетасовки. – markbernard

+1

@markbernard Нет необходимости. 'Collections.shuffle()' –

ответ

4

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

List<Integer> indices = IntStream.range(0, sizeOfArray).boxed().collect(toList()); 
Collections.shuffle(indices); 
for (int randomIndex : indices) { 
    // do your thing 
} 
3

Вместо того, чтобы проверять, есть ли у вас уже созданные вещи, подходите к нему по-другому. Создайте массив всех возможных значений, а затем произвольно перемешайте массив.

Вы можете использовать встроенный метод java.util.Collection.shuffle(List)

Для первоначального списка, порядок не имеет значения, но это легче всего просто заполнить его с 0..n-1 или 1..N значения один за другой. Выполнение этого более сложным способом никоим образом не помогает, так как случайное перемещение в любом случае полностью случайное.

0

Марко Топольник является Absolutly прямо с его answer. Это лучший способ сделать это.

Так что мой ответ просто ради завершения, после вашей первоначальной идеи с Random

Random r = new Random();      // as you had it 
    ArrayList<Integer> found = new ArrayList<>(); // as you had it 

    for(int i = 0; i < sizeOfArray; i++){   // if you want ALL possible indexes 
     int prediction = r.nextInt(sizeOfArray); // exactly as you did it 
     while(found.contains(prediction)){  // here we check if the "found" list already contains the random index 
      prediction = r.nextInt(sizeOfArray); // if so, regenerate the "prediction" until one is generated that is not in the list 
     } 
     found.add(prediction);     // this statement will only be reached after the while loop found an index that is not in the list 
    } 

    System.out.println(found.toString());   // convenience: print the list to see for yourself 

Как я уже сказал, это только после вашей первоначальной идеи использовать случайным образом. Я бы сделал это таким образом, если бы не было Collection.shuffle() :)

Смежные вопросы