簡體   English   中英

在ruby / rails中生成n個唯一的隨機整數

[英]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#randActiveSupport::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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM