[英]Generate n unique random integers in ruby / rails
我正在嘗試生成介於1和最大之間的n個唯一隨機數
我嘗試了以下代碼,但不起作用(返回重復的數字)
r = [ ]
n.times { v = rand(max) while r.include? v ; r << v}
它出什么問題了? 謝謝
添加:
最大是數千
n是10
不,不,請不要隨機生成,然后檢查,生成uniq數字,然后隨機排序 !
(1..max).sort_by{rand}
或者,在1.9中:
(1..max).to_a.shuffle
我認為您的r.include邏輯是錯誤的方法。 嘗試這個:
r = [ ]
while r.length < n
v = rand(max)
r << v unless r.include? v
end
請注意,如果max <n,這將進入無限循環。
我建議使用哈希而不是數組,因為比較Array中的數字的復雜度是array.length,而在哈希中則是1。最后您可以將哈希鍵傳輸到數組中。
hash = {} r = [ ]
while hash.length < n
a = rand(max)
if !hash_has_key? (a)
hash(a) = :ok
end
end
r = hash.keys
如果您測試n = 30000並且max = 500000,則與使用數組相比,所花費的時間有很大不同。
Kernel#rand
生成一個偽隨機數。 如果安全問題,這應該引起關注。
在Rails中使用ActiveSupport::SecureRandom.random_number
同樣, Kernel#rand
和ActiveSupport::SecureRandom.random_number
可能返回0,您說該值必須在1到最大值之間。
我不確定確切的ruby語法,但是作為一種算法:
list = [1 .. 10000];
nums = [];
while (nums.length < needed) {
nums.push( list.splice(rand() * list.length) )
}
只要您的范圍不太大,並且不必浪費時間整理整個列表,就應該可以很好地工作
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.