我有一個大小爲x的數組,我需要隨機瀏覽列表,但每次都要到達每個元素。什麼是最有效的方法來做到這一點?Java:如何隨機瀏覽數組?
回答
你所尋找的是洗牌
嘗試這個 -
// 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));
只是shuffle的數組,然後遍歷它。
Collections.shuffle(Arrays.asList(yourArrayReference));
集合未定義。什麼是收藏品? – BenRacicot
[Java集合](https://docs.oracle.com/javase/tutorial/collections/)。具體看算法部分。 – Mahesh
你可以使用一個隨機數發生器,它通常是在大多數面嚮對象語言默認提供的,並使用第二陣列來跟蹤你檢查什麼了。
本質:
- 產生一個隨機數
- 搜索主陣列的隨機數
- 如果隨機數是不是在已檢查的陣列...
- ...然後檢查元素在主陣列中[隨機]
- 將隨機數添加到已檢查陣列的末端
這是一個時間和空間高效的方式來做到這一點。
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;
}
}
這是非常不可讀的,雖然可怕的代碼。 5分鐘後,我仍然沒有看到是什麼。但是如果它真的遍歷一個數組(如OP問),那麼數組必須隱藏得很好。這個問題在4年前已經得到解答。 –
它僞隨機枚舉數組的索引。例如,如果你運行上面的代碼,你會得到類似於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
不錯,謝謝 – msangel
- 1. Java隨機數組
- 2. 瀏覽器cookie VS僞隨機數
- 3. Java的隨機數組
- 4. 從數組中隨機組合(Java)
- 5. Java腳本隨機數組函數
- 6. 如何用隨機數從crypto.getRandomValues中隨機化數組?
- 7. 隨機數組?
- 8. 如何填充具有特定隨機數的數組(java)
- 9. 如何乘以隨機數的數組
- 10. 如何在瀏覽器中顯示隨機圖像?
- 11. 2個隨機數組的交集 - Java
- 12. 在Java中隨機播放數組
- 13. Java程序的排序隨機數組
- 14. java中的隨機數組值
- 15. Java二維數組隨機分配
- 16. 隨機數組發生器Java
- 17. 生成隨機數組值Java
- 18. Java隨機數不是隨機的嗎?
- 19. 如何從一組隨機數中進行隨機選擇?
- 20. Java的隨機數
- 21. 如何在java中生成隨機數
- 22. 如何隨機散列(Java)?
- 23. 如何隨機java字符串數組,那每個數組都會是真隨機的?
- 24. 如何瀏覽Python中的數組?
- 25. 如何瀏覽嵌套數組列表?
- 26. 隨機遍歷數組(不隨機)
- 27. 隨機排列隨機數組
- 28. 如何總結Java中的隨機字母數組?
- 29. 如何在java中的數組中獲得隨機顏色
- 30. 如何從java數組中抽取非隨機樣本
的[以從列表中 n個隨機元素?]可能重複(http://stackoverflow.com/questions/4702036/take-n-random-elements-from-a-liste) –
templatetypedef
'但每個元素獲得一次「 - 這是否意味着你只想獲取每個元素一次?並且在洗牌後不再獲得該元素? – Rakesh
@Rakesh,是的,我只想讓每個元素只有一次。 – dee