我希望從數組中隨機選擇元素,其中每個元素都有特定的被選擇概率。有沒有一種有效的方式來做到這一點,或者可能是Java已經完成的內容?從數組中隨機選擇一個元素,每個元素具有特定的概率
回答
的一種方式是使用加權的概率這樣的:
MyClass getRandomElement(MyClass[] elements)
{
int totalWeight = 0;
for (MyClass element : elements)
{
totalWeight += element.weight;
}
int position = new Random().nextInt(totalWeight);
for (MyClass element : elements)
{
if (position < element.weight)
{
return element;
}
position -= element.weight;
}
throw new IllegalStateException("Should never get here");
}
這似乎是最好的方式來完成我所需要的,非常感謝你:) – xlnc
做到這一點的一種方法是建立一個數組,其中重複必要條款來表示它們的概率。因此,如果陣列中的項目A的概率爲.3,項目B的概率爲.7,則可以將它們放入10個項目的陣列中,A重複3次,B重複7.
然後,您可以使用隨機數生成器從數組中選擇一個索引。
另一種解決方案是將每個項目及其概率加載到數據結構中,將每個概率表示爲一個範圍(即項目A可以表示範圍0.5-8),然後生成隨機值從0-1開始,並抓取隨機數落入的任何範圍的值。
如果編碼在一個陣列中選擇的元件(可能是通過在陣列中的對象的成員變量)的概率重量你可以做如下:
- 假設你有重量爲整數的元素。
- 總和所有元素的權重。
- 在1和該權重之間創建一個隨機值。
- 遍歷數組,計數直到匹配隨機值。
實施例:
[1,3,2,5,2] 薩姆= 13 隨機軋輥= 5
元件[0] ..(我們已經計數,以1)
元件[1] ..(我們已經計數到4)
元件[2] ..(我們已經計數以6) 6> 5因此,我們選擇2.
現在,這需要O(n)時間,其中n是數組中值的數量。爲了提高效率,更好的方法是將值放在值所指示的位置。這有點像:
[a,b,b,b,c,c,d,d,d,d,d,e,e]。
查看counting sort瞭解更多詳情;它允許O(1)訪問。
的O(的log(n))的方法(這是直接從answer to a very similar question撕開):
通常的技術是將陣列轉化爲累加和的數組:
[10 60 5 25] --> [10 70 75 100]
皮克從0到累計總數範圍內的隨機數(例如:0 <= x < 100
)。然後,使用bisection累積陣列上的索引定位成原始陣列:
Random variable x Index in the Cumulative Array Value in Original Array
----------------- ----------------------------- ----------------------
0 <= x < 10 0 10
10 <= x < 70 1 60
70 <= x < 75 2 5
75 <= x < 100 3 25
例如,如果隨機變量X是4,二等分的累積陣列給出了對應於0的位置索引10在原始數組中。
而且,如果隨機變量x是72,那麼平分累積數組給出的位置索引爲2,其對應於原始數組中的5。
- 1. 從數組的特定元素中選擇隨機元素
- 2. 從一個集合中選擇一個元素的概率
- 3. 以概率從列表中選擇隨機元素
- 4. LINQ group by並從每個組中選擇隨機元素
- 5. 如何從數組中選擇一個隨機元素
- 6. 從PHP關聯數組中選擇一個隨機元素
- 7. 沒有特定的元素選擇元素(一個或多個)
- 8. 從關聯數組中選取一個隨機數組元素
- 9. 選擇一個隨機li元素 - jQuery
- 10. 從數組列表中隨機選擇5個元素而不重複元素
- 11. 隨機元素的統計/加權/概率選擇
- 12. 從關聯數組中選擇2個隨機元素
- 13. 從數組中隨機選擇獨特元素coffeescript
- 14. 選擇一個沒有內部特定元素的元素
- 15. 我們如何在數組中選擇一個隨機元素?
- 16. 數組操作 - 隨機選擇元素
- 17. python:從列表中選擇元素,出現一定概率
- 18. 從一個數組中隨機選取元素而不重複
- 19. 從異常數組中挑選一個隨機元素
- 20. 從陣列中挑選一個隨機數組元素
- 21. NumPy更改具有給定概率的數組的元素
- 22. 選擇隨機數組元素並放入另一個
- 23. 從numpy數組中選擇具有多個條件的元素
- 24. 選擇5個隨機元素
- 25. 從Selenium Webdriver的列表中選擇一個隨機元素Java
- 26. 選擇元素的父元素不具有特定的類
- 27. CSS選擇具有特定子元素的元素的同胞?
- 28. 選擇具有特定類的第一個元素?
- 29. 如何從Python中的數組中選擇一個隨機元素?
- 30. 從數組中選擇兩個元素
沒有內置到我知道的Java語言中。你可能想看看apache-commons-math(http://commons.apache.org/math/),它有許多有用的工具類來做隨機化。此外,你可能會得到更好的答案,這個問題是你向人們展示了一些你試過寫過的代碼來解決問題,或者至少是一個通用的算法,以表明你已經試圖自己弄清楚。人們通常不會在你要求我們爲你工作的情況下欣賞問題。 ;) –
嗯,我想到了一些天真的實現,似乎相當平凡但昂貴的使用,抱歉沒有包括我的代碼!感謝您的幫助,非常感謝:) – xlnc