2014-09-18 2 views
0

Я пытаюсь получить случайное число, не повторяющееся, из массива чисел. Каждый раз, когда я пытаюсь получить случайное значение из этого массива, он должен дать мне случайное число, не повторяющееся. Предыдущие случайные значения не должны повторятьсяПолучить случайное число, не повторяющееся из массива чисел

int[] integer_array = {0,1,2,3,4,5,6,7}; 
int random_no = should be random number from above array 
int random_no2 = should be random number from above array other than random_no 
int random_no3 = should be random number from above array other than random_no 
                   and random_no2 

Случайные не из массива могут быть получены в течение времени integer_array.length.

+2

Что вы хотите, это не последовательность случайных чисел, а перетасовка чисел 1..n, которые будут использоваться для метода 'Collections.shuffle()'. – biziclop

+0

Нет, это не так. Как один раз, когда я получаю одно random_no, я снова не делаю то же случайное число. Он выглядит хорошо для дальнего действия, но для небольшого диапазона он продолжает повторяться. – hsuk

+0

Вы не хотите, чтобы одно и то же значение два раза подряд? – iamnotmaynard

ответ

0

Вот мой код:

public static int[] getIndices(int maxValue, int numberOfIndices) { 
    // The result array. 
    int[] res = new int[numberOfIndices]; 
    Random rng = new Random(); 
    // A set of already used numbers. 
    TreeSet<Integer> was = new TreeSet<>(); 
    for (int i = 0; i < numberOfIndices; i++) { 
     // Generate a new number in range [0..maxValue - i]. 
     // It is a position of a new index in an array of unused values. 
     int cur = rng.nextInt(maxValue - i); 
     // Compute its position taking into account all values(used and unused) 
     // to obtain the real index. 
     for (int prev : was) 
      if (cur >= prev) 
       cur++; 
     // Add this index to the result array. 
     was.add(cur); 
     res[i] = cur; 
    } 
    return res; 
} 

Идея его заключается в создании позиции нового числа в массиве неиспользуемых значений (этот массив не поддерживается в явном виде), а затем вычислить реальное значение индекса с учетом уже использованных номеров.
Что хорошего в этом методе, то он вызывает только nextInt только numberOfIndices и гарантирует его создание разными номерами независимо от того, что nextInt возвращается.

+0

@hsuk мой код возвращает индексы, поэтому, если все элементы массива различны, он делает почти то, что вам нужно. – kraskevich

0
int[] integer_array = {0, 1, 2, 3, 4, 5, 6, 7}; 
    Random r = new Random(); 

    int random_no = r.nextInt(integer_array.length); 
    System.out.println(random_no); 

    int random_no2; 
    do { 
     random_no2 = r.nextInt(integer_array.length); 
    } while (random_no2 == random_no); 
    System.out.println(random_no2); 

    int random_no3; 
    do { 
     random_no3 = r.nextInt(integer_array.length); 
    } while (random_no3 == random_no || random_no3 == random_no2); 
    System.out.println(random_no3);