我知道我可以用樣本方法從數組中挑選一個隨機元素,但這會使元素被選中不止一次。我可以先排序數組,然後從第一個到最後一個元素,但我知道這是內存密集型的,如果可能的話,我正在尋找一個不太密集的方法!從Ruby中的數組中挑選隨機元素ONCE我只知道
2
A
回答
8
洗牌數組不佔用大量內存。 Ruby有一個默認的shuffle實現,它被稱爲Array.shuffle!
。看着這個,你可以看到源代碼(它的C):
rb_ary_shuffle_bang(ary)
VALUE ary;
{
long i = RARRAY(ary)->len;
rb_ary_modify(ary);
while (i) {
long j = rb_genrand_real()*i;
VALUE tmp = RARRAY(ary)->ptr[--i];
RARRAY(ary)->ptr[i] = RARRAY(ary)->ptr[j];
RARRAY(ary)->ptr[j] = tmp;
}
return ary;
}
此實現沿用經典Fisher-Yates algorithm。
所以:
- 洗牌使用
shuffle!
到位陣列。時間複雜度爲O(n)
,不需要額外的內存。 - 遍歷數組。時間複雜度爲
O(n)
,不需要額外的內存(只有一個整數才能保存當前索引)。
總的來說,你有你所需要的沒有額外的內存和時間複雜度O(n)
。
0
你必須跟蹤你已經選擇的元素;你打算怎麼做,把他們放在他們自己的陣列中?
隨機和重複。與追蹤已選擇的元素相比,這不會佔用更多內存。
1
如果數組元素是真的非常大,您可以嘗試簡單地洗牌索引列表,並遍歷是:
a = %w{a b c d e f g h}
[*0...a.size].shuffle.each do |index|
puts a[index]
end
10
sample
需要一個參數:
[*(1..10)].sample(5) #=>[3, 4, 1, 8, 9]
否元件將被選擇兩次。
+0
不是我的問題,但這是我不知道的事情,並且可以預見在將來有用。 +1 – KChaloux
相關問題
- 1. Javascript - 如何從數組中隨機挑選元素?
- 2. 從異常數組中挑選一個隨機元素
- 3. 從數組中挑選隨機元素並將其刪除
- 4. 從數組中挑選隨機元素,但唯一
- 5. 從陣列中挑選一個隨機數組元素
- 6. 從數組中挑選隨機數
- 7. 從數組中挑選隨機顏色
- 8. 從數組中挑選隨機NSNumber?
- 9. 每次在迭代中從int數組中挑選不同的隨機元素?
- 10. 從netLogo中的字符串列表/數組中挑選一個隨機元素
- 11. 從數組的特定元素中選擇隨機元素
- 12. Math.Random()挑選隨機數組
- 13. 從二維數組中挑選隨機元素的可能性相當可能
- 14. 無法隨機挑選一個元素的數組雨燕
- 15. 從MySQL中的一組數字中挑選一個隨機數
- 16. 從Ruby中的數組中挑選多個隨機值,並可能重複
- 17. 球拍 - 從列表中挑選一個隨機元素
- 18. 從關聯數組中選取一個隨機數組元素
- 19. 如何從C中的數組中隨機選取元素?
- 20. 從arraylist中挑選元素
- 21. 如何挑選數組中的隨機元素避免(除非是)某個值?
- 22. 挑選的NSArray中的隨機元素的Objective-C
- 23. Ruby從選擇列表中選擇隨機元素與optgroup
- 24. 從數組中隨機挑選和顯示數據
- 25. 動作2:從數組中挑選3個隨機數字
- 26. 從一組數字中挑選一個隨機數
- 27. 作爲迴應從JS數組中挑選的隨機句子
- 28. 在矢量的每N個元素中隨機挑選一個
- 29. Javascript:從數組中選擇不等於'undefined'的隨機元素
- 30. 如何從數組中挑選隨機聲音? (JS)
爲什麼說洗牌數組是內存密集型的?大多數天真的實現將數組混合就位。 – aromero
Docs聲明'#sample'不會多次選擇元素。 '[1,2] .sample(3)'返回'[1,2]'或者[2,1]'。 – Nick