繁体   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