Вот пример класса, который создает случайную перестановку, используя подход, предложенный Дэном Дайером. Он гарантирует, что каждый вызов .next() дает новое число до номера, указанного в конструкторе. После этого он обертывается и снова возвращает ту же последовательность. Это может быть полезно для перетасовки списка воспроизведения.
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class RandomPermutation{
private List<Integer> list;
private int index;
/**
* Create a random permutation the sequence of numbers 0, 1, ... , n - 1.
* @param n Range specifier, must be positive
*/
public RandomPermutation(int n) {
if (n <= 1) {
throw new IllegalArgumentException(
"Positive number expected, got: " + n);
}
list = new ArrayList<Integer>();
newList(n);
}
/**
* Creates a new list
*/
public void newList(int n) {
index = -1;
list.clear();
for (int i = 0; i < n; i++) {
list.add(i);
}
Collections.shuffle(list);
}
/**
* Retrieve the next integer in sequence.
*/
public int next() {
index = (index + 1) % list.size();
return list.get(index);
}
}
КПП. не используйте подход, используемый Снейком. Не только потому, что он замерзнет, как только все числа будут использованы. Это можно исправить. Проблема в том, что процедура выполняется медленнее и медленнее, поскольку все больше и больше номеров находятся в списке IdontWantAnymore. С 6 номерами это не проблема, но это может привести к значительному замедлению, если диапазон большой. Рассмотрим выбор между 10000 номерами. После того, как было выбрано 9900 номеров, есть шанс 1% получить хороший номер. после 9990 номеров есть 0,1% шанс поразить хороший номер и т.д.
Вот пример того, как можно использовать класс:
static RandomPermutation randomPerm = new RandomPermutation(7)
int NextRandomNumber() {
return randomPerm.next() + 1;
}
Если есть только 6 возможных значений, как вы собираетесь получить 7 уникальных номеров? –
«Уникальные» и «Случайные» являются взаимоисключающими. У вас не может быть обоих. –
@ Dan dyer sry my bad. я изменил его на 7. @greg D .. чувак, плз с принятым символом ... этот код создает уникальный и выкуп нет. – iscavengers