Я хочу сгенерировать пару случайных чисел без повторения пары. Как я могу реализовать его в java?Генерация пары случайных чисел в java без повторения пары
ответ
Random r = new Random();
int x, y;
do {
x = r.nextInt();
y = r.nextInt();
} while (x == y);
Это не будет повторно использовать какое-либо число на все, поэтому в дополнение к тому, чтобы не производить одну и ту же пару снова, она не создавала бы никакой пары, содержащей уже использованный номер. Хотя вопрос очень расплывчатый, я полагаю, что только одна и та же пара не должна создаваться дважды !? – tringel
Я не совсем понял, о чем он спрашивал, и он, кажется, не отвечает на комментарии, поэтому я дал ему то, что, как я думал, он хотел (пары не равных чисел). – McNultyyy
Нам необходимо отслеживать пары, которые уже сгенерированы. Следующий код должен делать:
Random random = new Random();
Map<Integer, Integer> generated = new HashMap<Integer, Integer>();
int x,y;
do{
x = random.nextInt();
y = random.nextInt();
if(!generated.containsKey(x) || generated.get(x) != y){
generated.put(x, y);
break;
}
}while(true);
В случае, если вам нужно больше, чем 2 числа, этот метод может быть более эффективным:
List<Integer> integers = IntStream.range(1, 10)
.boxed()
.collect(Collectors.toList());
Collections.shuffle(integers);
System.out.println(integers.get(0));
System.out.println(integers.get(1));
Насколько я понимаю ваш вопрос, который вы хотите, чтобы генерировать случайные пары чисел не повторяя их. Для этого нам прежде всего нужен класс, содержащий значения, так как это пара чисел, которые я буду называть кортежем.
public class Tuple {
private Integer first;
private Integer second;
public Tuple(int first, int second) {
this.first = first;
this.second = second;
}
public int getFirst() {
return first;
}
public int getSecond() {
return second;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Tuple tuple = (Tuple) o;
return first.equals(tuple.first) && second.equals(tuple.second);
}
@Override
public int hashCode() {
int result = first.hashCode();
result = 31 * result + second.hashCode();
return result;
}
}
Тогда нам нужен класс генератора для хранения максимально возможного целого числа, которое может отображаться в паре. Обратите внимание, что это число ограничивает количество пар, поскольку у вас могут быть кортежи, которые содержат 1 ... n чисел как первое число, и для каждого из них снова 1 ... n чисел как второй вы можете вернуть n * n кортежей максимум !
public class RandomTuples {
private final int highestInt;
private final Set<Tuple> usedTuples = new HashSet<>();
public RandomTuples(int highestInt) {
this.highestInt = highestInt;
}
public Tuple nextTuple() {
if (usedTuples.size() >= highestInt*highestInt) {
throw new RuntimeException("All possible tuples were used. " +
"Use a higher param when instantiating RandomTuples for more!");
}
Random rnd = new Random();
Tuple tuple = Stream
.generate(() -> new Tuple(rnd.nextInt(highestInt), rnd.nextInt(highestInt)))
.filter(filterTuple -> !usedTuples.contains(filterTuple))
.limit(1).findFirst().get();
usedTuples.add(tuple);
return tuple;
}
}
Исключение имеет решающее значение здесь, поскольку поток будет работать в тупике в противном случае. Это generate
новых кортежи пытаются получить по крайней мере, одну соответствующей записи (limit(1)
), тогда как filter
будет удалить эту запись, создавая бесконечный цикл ...
Затем вы должны создать экземпляр класса RandomTouples и вызвать метод генераторного, чтобы получить новый кортеж. При использовании высоких чисел это может работать с довольно плохими характеристиками, поскольку оно должно пытаться использовать возможные комбинации, пока не найдет тот, который еще не использовался.
public class RandomTuplesExample {
public static void main(String[] args) {
RandomTuples randomTuples = new RandomTuples(10);
for (int i = 0; i < 100; i++) {
Tuple tuple = randomTuples.nextTuple();
System.out.println("(" + tuple.getFirst() + ", " + tuple.getSecond() + ")");
}
}
}
- 1. Генерация случайных чисел без повторения в Java
- 2. Генерация случайных чисел без повторения
- 3. Генерация случайных чисел без повторения. C#
- 4. Генерация случайных чисел Java
- 5. Генерация случайных чисел в Java
- 6. генерация случайных чисел в java
- 7. Генерация случайных чисел в Java
- 8. генератор случайных чисел без повторения
- 9. порождает пары случайных чисел в java, так что p! = Q
- 10. Генерация случайных чисел без дубликатов
- 11. C++ генератор случайных чисел без повторения чисел
- 12. Java - генерация случайных кластеров чисел
- 13. несколько случайных чисел в php без повторения?
- 14. Генерация случайных чисел
- 15. Генерация параллельных случайных чисел
- 16. Java (генерация чисел без повторов)
- 17. Генератор случайных чисел без повторения Класс в Java
- 18. Пары целых чисел Синтаксис
- 19. генерация случайных чисел в C++
- 20. java: генерация случайных чисел в цикле
- 21. Генерация случайных чисел в C vs Java
- 22. Java Генерация случайных чисел в цикле for
- 23. Генерация список случайных чисел в Java
- 24. генерирование случайных чисел без последовательного повторения
- 25. Число случайных чисел без повторения номера
- 26. Создать список случайных чисел без повторения
- 27. Генерация случайных чисел биномиальных чисел
- 28. Генератор случайных чисел без повторения результатов
- 29. Создайте генератор случайных чисел без повторения
- 30. Создание 9 случайных чисел без повторения
Вы хотите сказать, что 2 случайных числа не должны быть равны? – McNultyyy
Пожалуйста, * делитесь * все, что у вас есть * попробовал * до сих пор. –
, как долго вы хотите это сделать? Пара повторений означает сортировку также? также пожалуйста, поделитесь тем, что вы пробовали –