Случайно выберите int number

У меня есть следующий код для ввода случайных чисел int

for (int i=1;i<=5;i++) { int rand= new Random().nextInt(10); Log.d("Ramdom number", String.valueOf(rand)); } 

Проблема в том, что я не хочу, чтобы случайные числа повторялись, когда я запускаю этот код, он дает мне 5 номеров, но два из них, по крайней мере, повторяются. Любой совет?

Для небольшого диапазона чисел на выбор это должно сделать трюк:

 ArrayList<Integer> numbers = new ArrayList<Integer>(); for (int i = 0; i < 20; ++i) { numbers.add(i); } Collections.shuffle(numbers); for (int i = 0; i < 5; ++i) { Log.d("Random number", numbers.get(i).toString()); } 

Проблема в том, что вы создаете объект Random в цикле. Если цикл является «жестким», как и в этом случае, объект Random будет засеян одним и тем же значением. Перемещение инициализации объекта Random вне цикла должно сделать трюк.

 Random r = new Random(); for (int i=1;i<=5;i++) { int rand= r.nextInt(10) Log.d("Ramdom number", String.valueOf(rand)); } 

РЕДАКТИРОВАТЬ:

Это должно работать (по крайней мере, для меня)

 public static Integer[] getRangedInt(int maxRange, int numCount) { if (maxRange < numCount) { throw new Exception("maxRange cannot be smaller than numCount"); } Set<Integer set = new HashSet<Integer>(); Random r = new Random(); while (Set.size() < numCount) { int random = r.nextInt(maxRange); while (!set.add(random)) { random = r.nextInt(maxRange); } } return set.toArray(new Integer[set.size()]); } 
 final int maxnumbers = 5; final int maxvalue = 10; final Random generator = new Random(); Set<Integer> numbers = new HashSet<Integer>(); while(numbers.size() < maxnumbers){ numbers.add(random.nextInt(maxvalue)); } 

После этого цикла вы должны иметь maxnumber неизменяющихся случайных чисел от 0 до maxvalue в заданных numbers . Вы должны следить за тем, чтобы использовать слишком много итераций при использовании этого метода, т. Е. Генерация 9999 неповторяющихся чисел из 10000, вероятно, займет много времени.

Другой более масштабируемой версией будет иметь список номеров:

 List<Integer> numbers = new ArrayList<Integer>(); for(int i = 0; i<maxvalue; i++){ numbers.add(i); } Collections.shuffle(numbers); List<Integer> randomnums = numbers.subList(0, maxnumbers); 

Я думаю, вам нужен набор случайных чисел. Этот намек должен быть достаточным.

Если нет, то прокомментируйте.

Вы можете сохранить один список сгенерированных чисел

 boolean flag=false; Vector<int> vec = new Vector<int>(); for (int i=1;i<=5;i++) { flag=false; int rand= r.nextInt(10); for(int j=0;j<vec.size();j++) { if(vec.get(j)==rand) { flag=true; break; } } if(flag) { continue; } else { Log.d("Ramdom number", String.valueOf(rand)); vec.add(rand); } } 

Вы можете сохранить вектор сгенерированных чисел и проверить

Является ли этот номер уже сгенерированным, а затем генерирует новый

Иначе отобразите этот номер

Так что вы ищете не список случайных чисел, это список из 30 номеров, заказанных произвольно.

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

 for(int i=1; i<=30; i++) { double r = rand(); while (null != aTreeSet.get(r)) r = rand(); aTreeSet.put(r, i); } 

Где rand() возвращает некоторое случайное значение (а не 1-30, которое вы ищете, это i ), возможно, между 0 и 1, а aTreeSet – это то, что вы думаете.

Цикл предотвращает печаль в маловероятном случае дублирования, возвращаемого rand() .

Чтобы использовать это, вытащите значения из aTreeSet в отсортированном порядке.

Edit – Валовое решение

Другой способ – генерировать значение 1-30, и если он еще не находится в «Я видел это», добавьте его и верните значение. Если он есть, создайте новое случайное число. Повторяйте, пока не будет обнаружен неиспользуемый номер. Это выполняется плохо, условно говоря, для последних нескольких значений. Разумеется, для 30 значений для современных процессоров это будет сделано в миллисекундах. Если ваше максимальное значение было 1000 вместо 30, я бы начал беспокоиться.

То, что вы хотите, это случайная комбинация, используйте таблицу хэша, чтобы избежать повторений

С верхней части моей головы код должен выглядеть примерно так:

  Ramdom r = new Random(); Hashtable<Integer, Integer> h = new Hashtable<Integer, Integer>(); while( h.keys().size() < 5 ) { int i = r.nextInt(10); h.put(i,i); } Integer[] k = (Integer[]) h.keySet().toArray(); 

Линия

  h.put(i,i); 

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

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

 Random r = new Random(); Set<Integer> generatedNumbers = new HashSet<Integer>(); for(int i = 1;i<=5;i++) { int rand = r.nextInt(10) if (!generatedNumbers.contains(rand)) { Log.d("Ramdom number", String.valueOf(rand)); generatedNumbers.add(rand); } } 
Intereting Posts
Обновленный Android SDK и Android Studio испортили все мои XML-файлы: «Элемент XXX здесь не разрешен» Как запустить приложение для андроидов с помощью веб-бэкэнда? Элементы галереи, перекрывающиеся (сбрасываются) Показывать уведомление только на носимом носителе Как настроить гравитацию текстового вида программно с помощью RelativeLayout? Рекурсивный метод работает в java с консолью, но не с android Как наложить GLSurfaceView на MapView в Android? «Режим выбора текста» работает одинаково для всех видов и устройств Что такое квота устройства в день для Android c2dm? Фотографии, снятые с камеры Android, полностью черные Почему ContentObserver вызывается несколько раз? Android Facebook SDK v3.0 SSO LoginButton возвращает нулевой GraphUser Proguard вызывает RuntimeException (Unmarshalling неизвестный тип кода) в классе Parcelable Настройка EditText imeOptions на actionNext не влияет на использование цифр Неожиданное поведение RadioButton