2012-03-21 2 views
0

У меня проблема со случайными и массивами. У меня есть список пустой список, и я хочу добавить 8 случайных значений, но я не хочу, чтобы некоторые значения были одинаковыми. Чтобы получить случайное значение, я использую этот код:Массивы и случайное значение

 for (int i = 0; i < 8; i++) { 
      round = random.nextInt(31); 
      while (temp.get(round).equals(mix)) { 
       round = random.nextInt(31); 
      } 
      mix.add(temp.get(round)); 
     } 

температура составляет список с 32 объектов и микс мой список, где я хочу, чтобы добавить 8 случайных значений. Но когда я иногда меняю некоторые значения, я получаю одинаковые значения. Как я могу получить случайные значения, но без дубликатов?

+0

Вы можете преобразовать свой массив в список и использовать метод contains arraylist, чтобы проверить, присутствует ли он. Если нет, добавьте его. Else, сгенерируйте новый и повторите попытку. Преобразование в список может быть выполнено с помощью Arrays.asList() (если вы используете Java 6) –

+0

Возможный дубликат [Уникальные случайные числа в O (1)?] (Http://stackoverflow.com/questions/196017/ Уникальные-случайные числа-в-o1) – paxdiablo

ответ

2

в то время как другие описывают способы реализации нового решения, я думаю, что ваш может быть исправлена ​​путем изменения одну строку:

while (temp.get(round).equals(mix)) 

Я думаю, состояние предполагается проверить эл Номер temp в позиции round уже есть в mix. Это должно сделать:

while (mix.contains(temp.get(round)) 

Проблемой с первой линией является то, что equals определяется сравнивать объект с любым другим видом объекта, и, таким образом, сравнивает элемент temp, который, вероятно, не сама коллекции, в mix, который есть. Таким образом, условие всегда ложно. Collection.contains - это способ использования, и вам нужно использовать один из mix. (Как указывали другие, Set лучше всего подходит для случая, когда contains применяется часто, но для 8 случаев, когда вам нужно, не имеет значения, действительно ли mix - это List).

[править]: Кстати: так как верхняя грань в random.nextInt(int) исключается, вы должны только когда-либо получить конечный элемент 32 размера temp в вашем mix, если вы используете nextInt(32).

3

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

Удаление возвращенных элементов из списка предотвращает возврат одного и того же номера дважды, и вы можете увидеть дальнейшие подробности и реализацию Java, here.

3

Сделайте коллекцию из 32 предметов, перетасуйте их и возьмите первые 8 из них.

List <Integer> list = new ArrayList <Integer>();  
for (int i = 0; i < 32; ++i) 
{ 
    list.add (i); 
} 
Collections.shuffle (list); 
1

Вы можете добавить свои номера в Set. Продолжайте добавлять элементы, пока ваш набор не будет иметь правильное количество элементов.

while (set.size() < n) 
{ 
    int item = random.nextInt(m); 
    set.add(item); 
} 

Обратите внимание, что это, вероятно, будет выполняться нормально для большинства ситуаций. Однако он будет работать плохо, если и n большой, и m - n невелик.

1

Использовать набор. Поместите свои значения rundom установить, пока его размер не будет равен вашим заранее заданное число (например, 8):

Random random = new Random(System.currentTimeMillis()); 
Set<Integer> randomSet = new HashSet<Integer>(); 
while(randomSet.size() < 8) { 
    randomSet.add(random.nextInt(31)); 
} 
// now random set contains 8 different random numbers. 
0
 int randomCounter = 31; 

     for (int i = 0; i < 8; i++) { 
     round = random.nextInt(randomCounter); 
     int roundInTemp = temp.get(round); 
     mix.add(rountInTemp); 
     temp.remove(roundInTemp); 
     randomCounter--; 
    } 

Другой способ состоит в перетасовать список временный (с Алгоритм Построения вы найдете отлично) и использовать list.sublist(0, 8)

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