2014-02-07 1 views
0

Мне просто интересно, как я должен генерировать два числа в java, которые отличаются друг от друга.Как я должен произвольно генерировать два числа одновременно без их дублирования?

Я хочу выбрать два числа между 1-3 случайным образом, однако, я не хочу, чтобы они были одинаковыми числами?

Как мне это сделать? Я пытался использовать петлю и я получаю тот же номер

это то, что я сделал

Random random = new Random(); 

for(int i =0; i<3; i++){ 
     int randomInteger = random.nextInt(); 
     System.out.println("Random Integer in Java: " + randomInteger); 
} 

ответ

0

Ну код собирания целого чисел случайным образом, но это печатая их в то же время без проверки каких-либо дубликатов. Кроме того, он не указывает, что он должен быть между 1-3

Так вот как это можно сделать.

Конечно, вам нужно сначала import java.util.Random.

Random rand = new Random(); 
int value = rand.nextInt(3) +1; // this will choose a number between 1-3 not 0-2 
int secondvalue = rand.nextInt(3) +1; // same thing but we need 2 of them since we want 2 random numbers and not only 1 ! 

while(value == secondvalue) { //to see if the first random number = the second 
    secondvalue = rand.nextInt(3) +1; // if so, regenerate the second randomly 
} 

// and finally print them 
System.out.println(" Value is " + value); 
System.out.println(" Value is " + second value); 

Существует множество способов сделать это, но я считаю, что это самый простой способ справиться с этим.

+0

это не печатает их в то же время в его код .. – Dropout

+0

Фактически, если он внутри цикла, он будет напечатан в одно и то же время. – rullzing

1

Решение зависит от масштаба, который вы будете использовать. Вы можете либо генерировать числа, пока не получите требуемые результаты, что в вашем случае лучше, или вы можете «выбрать» случайные элементы набора чисел, если содержимое известно заранее.

Генерирование пока вы не получите результаты, с использованием while отказа:

Random random = new Random(); 

int first = random.nextInt(3)+1; 
int second; 

while(second == null || first == second){ 
    second = random.nextInt(3)+1; 
} 

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

Другой подход - выбрать номера из перетасованного набора.

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

for(int j = 0; j<2; j++) 
{ 
    System.out.println(numberSet.get(j)); 
} 

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

0
Random random = new Random(); 

Set<Integer> twoSet = new HashSet<>(); 

while (twoSet.size() < 2) { 
    twoSet.add(random.nextInt(someNumber); 
} 

Обратите внимание, что если ваш диапазон слишком мал, это будет бесконечно контурным.

Кроме того, вы можете захотеть взглянуть на это: http://en.wikipedia.org/wiki/Reservoir_sampling

1

следующее решение использует «виртуальные» удаление первого числа, без использования списка или набора. Он также оптимизирован для заданного диапазона и получает оба значения одним вызовом Random.nextInt().

Random rand = new Random(); 
    for (int k=0; k<10; k++) { 
     int v12=rand.nextInt(6); 
     int v1=v12>>1; 
     int v2=v12 & 0x1; 
     if (v2>=v1) v2++; 
     v1++; v2++; // from 0..2 to 1..3 
     System.out.println("" + v1+" "+v2); 
    } 
+0

Моя челюсть просто упала. Я должен сделать это в абсолютном благоговении. – Dropout

0

Поскольку существуют только 6 комбинаций возможных ответов, они могут быть сведены в таблицу, а затем случайным образом извлекается из этой таблицы:

static int[] v1s=new int[]{1,1,2,2,3,3}; 
static int[] v2s=new int[]{2,3,1,3,1,2}; 

    Random rand = new Random(); 
    for (int k=0; k<10; k++) { 
     int v12=rand.nextInt(6); 
     int v1=v1s[v12]; 
     int v2=v2s[v12]; 
     System.out.println("" + v1+" "+v2); 
    } 
Смежные вопросы