在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#randActiveSupport::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) ) } 

应该工作得相当好,只要你的范围不是太大而且不需要浪费时间来改变整个列表