2011-09-14 2 views
0

У меня есть массив размера x, и мне нужно пройти список случайно, но каждый раз попадаю в каждый элемент. Каков наиболее эффективный способ сделать это?Java: Как случайным образом пройти через массив?

+1

возможно дубликат [Возьмите п случайных элементов из списка ?] (Http://stackoverflow.com/questions/4702036/take-n-random-elements-from-a-liste) – templatetypedef

+0

'но добираться до каждого элемента один раз. - Означает ли это, что вы хотите получить каждый элемент только один раз? и не получить этот элемент снова после перетасовки? – Rakesh

+0

@ Rakesh, да, я хочу получить каждый элемент только один раз. – dee

ответ

8

Что вы ищете перетасовать

попробовать this-

// Create a list 
List list = new ArrayList(); 

// Add elements to list 

// Shuffle the elements in the list 
Collections.shuffle(list); 

// Create an array 
String[] array = new String[]{"a", "b", "c"}; 

// Shuffle the elements in the array 
Collections.shuffle(Arrays.asList(array)); 
3

Просто shuffle массив, а затем итерацию над ним.

Collections.shuffle(Arrays.asList(yourArrayReference)); 
+0

Коллекции не определены. Что такое коллекции? – BenRacicot

+1

[Сборники Java] (https://docs.oracle.com/javase/tutorial/collections/). В частности, посмотрите раздел «Алгоритмы». – Mahesh

0

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

По существу:

  1. Генерирует случайное число
  2. Поиск Основной массив для случайного числа
  3. Если случайное число не в уже проверенного массив ...
  4. ... затем проверьте элемент в основной матрице [случайный]
  5. Добавить случайное число в конец уже проверенной матрицы
2

Это эффективный способ времени и пространства.

import java.util.Enumeration; 
import java.util.Random; 

public class RandomPermuteIterator implements Enumeration<Long> { 
    int c = 1013904223, a = 1664525; 
    long seed, N, m, next; 
    boolean hasNext = true; 

    public RandomPermuteIterator(long N) throws Exception { 
     if (N <= 0 || N > Math.pow(2, 62)) throw new Exception("Unsupported size: " + N); 
     this.N = N; 
     m = (long) Math.pow(2, Math.ceil(Math.log(N)/Math.log(2))); 
     next = seed = new Random().nextInt((int) Math.min(N, Integer.MAX_VALUE)); 
    } 

    public static void main(String[] args) throws Exception { 
     RandomPermuteIterator r = new RandomPermuteIterator(100); 
     while (r.hasMoreElements()) System.out.print(r.nextElement() + " "); 
    } 

    @Override 
    public boolean hasMoreElements() { 
     return hasNext; 
    } 

    @Override 
    public Long nextElement() { 
     next = (a * next + c) % m; 
     while (next >= N) next = (a * next + c) % m; 
     if (next == seed) hasNext = false; 
     return next; 
    } 
} 
+0

Это очень нечитаемый и даже страшный код. Через 5 минут я все еще не вижу, что делает. Но если он действительно проходит через массив (например, запрос OP), то массив должен быть очень хорошо скрыт. И этот вопрос уже был дан 4 года назад. –

+0

Он псевдослучайно перечисляет индексы массива. Если вы запускаете приведенный выше код, например, вы получите что-то вроде 50 52 3 6 45 40 26 49 92 11 80 2 4 19 86 61 65 44 27 62 5 32 82 9 84 35 38 77 72 7 ... для массива с индексы 0..99. – aykutfirat

+0

хороший, спасибо – msangel

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