2013-09-16 3 views
0
static int n = -1; 
private static int repeatBuffer[] = new int[10]; 
static { 
    repeatBuffer[0] = 0; 
    //and more 
    repeatBuffer[9] = 9; 
} 
static public void randomize() { 

    do { 
     Random r = new Random(); 
     randomNumber = r.nextInt(20); 
    } while (!uniqueInt(randomNumber)); 
    Log.e(TAG, "" + randomNumber); //here I need have a unique int 
} 

private static Boolean uniqueInt(int random) { 

    for (int i = 0; i < 9; i++) { 
     if (random == repeatBuffer[i]) { 
      return false; 
     } 
    } 
    if (++n > 9) 
     n = 0; 
    repeatBuffer[n] = random; 
    return true; 
} 

Иногда я получаю то же самое int дважды, мне интересно, где проблема? И это даже работает? Я трачу на это много времени, и я сдаюсь. Я думаю, что мне нужны некоторые мелкие хитрости в коде :)Как получить уникальный случайный int?

+1

random! = Unique – thepoosh

ответ

5

Более простой способ получить случайный int - создать список целых чисел List<Integer>, добавив его номерами, которые вы хотели бы иметь. Затем перетасовываем список, используя Collections.shuffle(list);. Теперь начните чтение с начала списка, и каждый раз вы получите уникальный случайный int.

Просто убедитесь, что каждый раз, когда вы «читаете» число из списка, удаляйте его из списка или увеличивайте индекс для того, где вы читаете.

+1

Спасибо, я никогда не использовал это раньше. Я всегда использовал Random r = new Random(); :) Список и коллекции более дружелюбны и проще. :) –

3

Это нормальное поведение генератора случайных чисел, правильно генерировать повторяющиеся числа, пока распределение чисел остается однородным.

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

+1

Я думаю, что это то, что на самом деле пытается сделать OP. Они просто испортили реализацию. –

2

Er, уникальный случайный от 1 до 20? Что произойдет, когда он пройдет 21-й раз?

Попробуйте сделать List целых чисел от 1 до 20. Используйте Collections.shuffle(), чтобы перетасовать список. Затем поместите первый элемент в начало списка и используйте его.

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