2013-06-20 5 views
-2

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

 rndNumber = rndNumbers.nextInt(max); 
     num1.setText(Integer.toString(rndNumber)); 


     rndNumber = rndNumbers.nextInt(max); 
     num2.setText(Integer.toString(rndNumber)); 

     rndNumber = rndNumbers.nextInt(max); 
     num3.setText(Integer.toString(rndNumber)); 

     rndNumber = rndNumbers.nextInt(max); 
     num4.setText(Integer.toString(rndNumber)); 

     rndNumber = rndNumbers.nextInt(max); 
     num5.setText(Integer.toString(rndNumber)); 

     rndNumber = rndNumbers.nextInt(max); 
     num6.setText(Integer.toString(rndNumber)); 
+2

Я запутался об этом: 'INT НБР = 1; nbr <2; '. Разве это просто не выполняется, как если бы цикл 'for' был даже там? –

+0

В моем ответе ниже перечислены все вещи, о которых вы упомянули, и делает именно то, что вы просили. –

ответ

2

Оберните генератор случайных чисел, чтобы сохранить результаты в наборе. При создании номера, если он существует в наборе, сделайте это еще раз:

Комментарии, сделанные другими о для петель справедливы ...

псевдокод:

class MyRandomNums { 
    Set<Integer> usedNums; 

    public int getRandom() 
    { 
     int num = random.nextInt(); 
     while(usedNums.contains(num)) { 
      num = random.nextInt(); 
     } 
     usedNums.add(num); 
     return num; 
    } 

    public int reset() 
    { 
     usedNums.clear(); 
    } 
} 
+0

OP должен знать, что это не детерминированный подход (есть небольшая вероятность, что 'getRandom()' никогда не закончится). По мере увеличения и заполнения заданного размера время выполнения увеличивается довольно быстро. –

+0

@AntiEarth на 99% прав - особенно если вы пытаетесь использовать диапазон (то есть от 1 до 6: если вы выберете 6 номеров, вам гарантирован бесконечный цикл, так как вы исчерпали диапазон). - легко обнаружить, если у вас установленный диапазон. Гораздо сложнее, если вы не ... Почему 99%, а не 100? ИМХО это все еще детерминировано (иначе, пожалуйста, объясните, почему это не так - я скорее компьютерный парень, чем парень-математик) – John3136

+0

«[Детерминизм утверждает, что] для всего, что происходит, есть такие условия, что, учитывая эти условия, ничего больше могло случиться." Рассмотрим условие наличия только 1 вакансии в 'usedNums', а событие - количество генерируемых случайных чисел (или время выполнения). Результат (с точки зрения времени) вполне вероятен (предположим, что это чисто случайный генератор чисел, я полагаю, что ** ** имеет детерминистский характер в наших компьютерах); число случайных чисел, сгенерированных для заполнения этой последней вакансии, не является постоянным во всех испытаниях (те же предварительные условия, разные должности). –

0

Все о цикл for-loops один раз. Почему:

for (int nbr = 1; nbr < 2; nbr++) { 
    rndNumber = rndNumbers.nextInt(max); 
    num1.setText(Integer.toString(rndNumber)); 
} 

, когда вы можете просто сделать:

rndNumber = rndNumbers.nextInt(max); 
num1.setText(Integer.toString(rndNumber)); 

?

0
int min = 0; 
int max = 100; 
List<Integer> randoms = new ArrayList<Integer>(); 
for(int i = min; i <= max; i++) randoms.add(i); 
Collections.shuffle(randoms); 

Затем вы можете использовать его как это:

int randomNumber = randoms.remove(0); 
+0

Привет! но как мне отобразить это в 6 разных edittext? – belladonna

0

Вот один из способов сделать все то, что вы упомянули:

private static boolean arrayContainsInt(int array[], int val, int x) { 
    for(int i = 0; i < x; i++) { 
     if(array[i] == val) { 
      return true; 
     } 
    } 
    return false; 
} 

public static int[] randomNumbers(int count, int minInclusive, int maxNonInclusive) { 
    int randoms[] = new int[count]; 
    Random rand = new Random(); 
    int impossibleValue = minInclusive - 1; 
    for(int i = 0; i < randoms.length; i++) { 
     randoms[i] = impossibleValue; 
    } 
    for(int x = 0; x < count; x++) { 
     int thisTry = impossibleValue; 
     while(thisTry == impossibleValue || arrayContainsInt(randoms, thisTry, x)) { 
      thisTry = (int)(rand.nextFloat() * (float)(maxNonInclusive - minInclusive)) + minInclusive; 
     } 
     randoms[x] = thisTry; 
    } 
    return randoms; 
} 

Если вы задаетесь вопросом о скорости, здесь это некоторая статистика:

randomNumbers(1000, 0, 10000) ==> 16 миллисекунд

(1000 случайных чисел. от 0-> 10000 без каких-либо повторов)

randomNumbers(10000, 0, 10000) ==> 207 мс

(Каждое число от 0-> 10000 генерируется в случайном порядке)

Метод randomNumbers подается число случайных чисел для генерации, минимального значения (включительно) и максимального значения (не включительно) и возвращает массив рандомов с учетом поставленных параметров.

Примечание: если предоставленный параметр count больше, чем значение maxNonInclusive - minInclusive, то он будет вращаться бесконечно, просто потому, что вы не можете придумать больше целых чисел, чем диапазон.

Кроме того, arrayContainsInt посылается параметр x в качестве значения следующего максимального индекса в массиве, чтобы проверить, потому что только x многие элементы массива были заселены, поэтому проверка остальное не имеет смысл.

0

для буквенно-цифровой номер попробовать это

public String getRandomNum(int randomLength) 
{ 
    return new BigInteger(130, random).toString(32).toUpperCase().substring(0, randomLength); 
} 

если вы хотите только числовые случайное число попробовать это

public String getRandomNum(int randomLength) 
{ 
    int value = (int)(Math.random() * 9999); 
    String format = "%1$0"+randomLength+"d"; 
    String randomNum = String.format(format, value); 
    return randomNum; 
} 
Смежные вопросы