Ruby //范围之间的随机数,确保与现有存储的其他数据的唯一性

时间:2014-02-23 11:34:44

标签: ruby random integer

目前正在尝试生成特定范围内的随机数; 并确保它对其他存储的记录是唯一的。

使用Mysql。可能像一个id,递增;但不可能。

目前以“昂贵”的方式测试其他现有记录; 但我很确定会使用干净的1/2行代码

目前正在使用:

test = 0
Order.all.each do |ord|
  test = (0..899999).to_a.sample.to_s.rjust(6, '0')
  if Order.find_by_number(test).nil? then
    break
  end
end
return test

感谢您的帮助

3 个答案:

答案 0 :(得分:2)

这是你的一线解决方案。自从调用.pluck以从Order表中检索数字以来,它也更快。 .select为每条记录实例化一个“Order”对象(这是非常昂贵且不必要的),而.pluck则没有。它还避免使用.map再次迭代每个对象以获取“数字”字段。如果我们在这种情况下使用.map转换为数据库中的数值,我们也可以避免第二个CAST

(Array(0...899999) - Order.pluck("CAST('number' AS UNSIGNED)")).sample.to_s.rjust(6, '0')

答案 1 :(得分:1)

我认为,您可以执行以下操作:

def uniq_num_add(arr)
 loop do
   rndm = rand(1..15)  # I took this range as an example
    # random number will be added to the array, when the number will 
    # not be present
    break arr<< "%02d" % rndm unless arr.include?(rndm)
  end  
end  

array = []

3.times do
 uniq_num_add(array)
end  

array # => ["02", "15", "04"]

答案 2 :(得分:1)

我会做这样的事情:

# gets all existing IDs
existing_ids = Order.all.select(:number).map(&:number).map(&:to_i)

# removes them from the acceptable range
available_numbers = (0..899999).to_a - existing_ids

# choose one (which is not in the DB)
available_numbers.sample.to_s.rjust(6, '0')