我有一個集合:[1,2,3,4,5,6,7,8,9],我需要從中產生隨機數的獨特元素,例如5,3,7,9,下一次:4,8。我的函數運行良好,但有時會拋出StackOverflowError,因爲遞歸調用函數會生成隨機數並檢查是否沒有重複項。我想知道如何防止這種情況發生。StackOverflowError和隨機數
-1
A
回答
1
您應該在不使用遞歸的情況下執行此操作。算法的草圖,可能效果更好:
- 創建一個空的列表
- 經過源陣列,並用50%的概率每一個元素添加到列表中
- 列表轉換爲數組
- 使用Arrays.shuffle()陣列上隨機重新排序的元素
這應該做的工作。
1
一個解決方案是使用迭代(一個for
或while
循環)而不是遞歸。
另一種解決方案是首先製作一個可變的集合副本,並且每當您從中選擇一個元素時,刪除該元素,以便不存在重新選擇它的風險。 (但請確保您製作的是您的收藏集的實際副本,例如new ArrayList<Integer>(originalCollection)
,這樣您就不會從原始元素中刪除元素。)
0
完整列表中的每個元素都存在或不存在於特定元素集合中。這告訴我們使用二進制。
0b000000000
映射到[],即所有數字不存在。
0b111111111
映射到[1,2,3,4,5,6,7,8,9],即存在所有數字。
兩者之間的任何數字都被視爲二進制數據,將映射到整個集合的一個子集。
0b001010101
映射到[3,5,7,9]
在範圍內的每個二進制數將映射到一個唯一的子集。你的例子意味着排序可能很重要。如果是,那麼你將不得不單獨處理它。這種方法會給你最多2^9 = 512種不同的組合。
相關問題
- 1. 總和隨機數
- 2. gfortran和隨機數
- 3. 隨機和負數
- 4. 數組和隨機數
- 5. 數組,函數和隨機
- 6. 數組和隨機值
- 7. c#概率和隨機數
- 8. 隨機數和微軟CNG
- 9. Java循環和隨機數
- 10. 隨機int64和float64數字
- 11. 概率和隨機數
- 12. 隨機數的總和
- 13. Android隨機數和edittext
- 14. 隨機數和多鍵c#
- 15. 具有隨機範圍和函數的隨機數組
- 16. 在隨機生成50個隨機數中使用隨機數#
- 17. FROM random隨機導入*和導入隨機有什麼區別? (隨機()和randrange())
- 18. 爲每一行隨機(隨機)數據
- 19. 隨機ArrayList沒有隨機數
- 20. C#隨機數是不是「隨機」
- 21. 隨機數發生器dev /隨機
- 22. 隨機()不生成隨機數
- 23. 從隨機長生成隨機數
- 24. 隨機類不會創建隨機數?
- 25. Java隨機數不是隨機的嗎?
- 26. 隨機函數隨機化字母
- 27. 隨機數發生器自動隨機
- 28. 隨機種子來產生隨機數
- 29. 再現隨機數(Python的2 /隨機)
- 30. 隨機遍歷數組(不隨機)
請發表相關的代碼。 – kosa
我認爲[這個鏈接](http://stackoverflow.com/questions/11842533/generating-random-unique-data-takes-too-long-and-eats-100-cpu)應該有所幫助。我之前遇到過類似的問題。 但我覺得你應該發佈一些代碼。 –
[什麼是StackOverflowError?]可能重複(http://stackoverflow.com/questions/214741/what-is-a-stackoverflowerror) – Raedwald