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