在ruby / rails中生成n个唯一的随机整数
我试图在1和最大之间生成n个唯一的随机数
我尝试了以下代码但不起作用(返回重复的数字)
r = [ ] n.times { v = rand(max) while r.include? v ; r << v}
它出什么问题了? 谢谢
添加:
最多是数千
n是10
我认为你的r.include逻辑是错误的方式。 试试这个:
r = [ ] while r.length < nv = rand(max) r << v unless r.include? v end
请注意,如果max
不,不,不随机生成然后检查,生成uniq数字然后随机排序 !
(1..max).sort_by{rand}
或者,在1.9中:
(1..max).to_a.shuffle
Kernel#rand
生成伪随机数。 如果安全性成为问题,这应引起关注。
在Rails中使用ActiveSupport::SecureRandom.random_number
此外, Kernel#rand
和ActiveSupport::SecureRandom.random_number
可能返回0,您说该值必须介于1和最大值之间。
我建议使用哈希而不是数组,因为比较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,与使用数组相比,消耗的时间是非常不同的。
我不确定确切的ruby语法,但作为算法:
list = [1 .. 10000]; nums = []; while (nums.length < needed) { nums.push( list.splice(rand() * list.length) ) }
应该工作得相当好,只要你的范围不是太大而且不需要浪费时间来改变整个列表