2011-09-14 59 views
0

我有一個大小爲x的數組,我需要隨機瀏覽列表,但每次都要到達每個元素。什麼是最有效的方法來做到這一點?Java:如何隨機瀏覽數組?

+1

的[以從列表中 n個隨機元素?]可能重複(http://stackoverflow.com/questions/4702036/take-n-random-elements-from-a-liste) – templatetypedef

+0

'但每個元素獲得一次「 - 這是否意味着你只想獲取每個元素一次?並且在洗牌後不再獲得該元素? – Rakesh

+0

@Rakesh,是的,我只想讓每個元素只有一次。 – dee

回答

8

你所尋找的是洗牌

嘗試這個 -

// 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