2012-09-05 44 views
-1

我有一個集合:[1,2,3,4,5,6,7,8,9],我需要從中產生隨機數的獨特元素,例如5,3,7,9,下一次:4,8。我的函數運行良好,但有時會拋出StackOverflowError,因爲遞歸調用函數會生成隨機數並檢查是否沒有重複項。我想知道如何防止這種情況發生。StackOverflowError和隨機數

+3

請發表相關的代碼。 – kosa

+0

我認爲[這個鏈接](http://stackoverflow.com/questions/11842533/generating-random-unique-data-takes-too-long-and-eats-100-cpu)應該有所幫助。我之前遇到過類似的問題。 但我覺得你應該發佈一些代碼。 –

+0

[什麼是StackOverflowError?]可能重複(http://stackoverflow.com/questions/214741/what-is-a-stackoverflowerror) – Raedwald

回答

1

您應該在不使用遞歸的情況下執行此操作。算法的草圖,可能效果更好:

  1. 創建一個空的列表
  2. 經過源陣列,並用50%的概率每一個元素添加到列表中
  3. 列表轉換爲數組
  4. 使用Arrays.shuffle()陣列上隨機重新排序的元素

這應該做的工作。

1

一個解決方案是使用迭代(一個forwhile循環)而不是遞歸。

另一種解決方案是首先製作一個可變的集合副本,並且每當您從中選擇一個元素時,刪除該元素,以便不存在重新選擇它的風險。 (但請確保您製作的是您的收藏集的實際副本,例如new ArrayList<Integer>(originalCollection),這樣您就不會從原始元素中刪除元素。)

0

完整列表中的每個元素都存在或不存在於特定元素集合中。這告訴我們使用二進制。

0b000000000映射到[],即所有數字不存在。

0b111111111映射到[1,2,3,4,5,6,7,8,9],即存在所有數字。

兩者之間的任何數字都被視爲二進制數據,將映射到整個集合的一個子集。

0b001010101映射到[3,5,7,9]

在範圍內的每個二進制數將映射到一個唯一的子集。你的例子意味着排序可能很重要。如果是,那麼你將不得不單獨處理它。這種方法會給你最多2^9 = 512種不同的組合。