将查询划分为两个随机组

时间:2014-04-07 21:55:13

标签: ruby-on-rails ruby

我正在进行AB测试,需要划分人口。我应该如何划分类似的东西 User.where(:condition => true)随机分成两组大致相同的组?

我正在考虑遍历整个数组并根据随机值推送到另外两个数组中的一个,但这是一个很大的查询,听起来很慢。

e.g。

array.each do |object|
  if rand(2) == 0
    first_group << object
  else
    second_group << object
  end
end

3 个答案:

答案 0 :(得分:1)

要从数据库中获取随机排序,您可以

# MySQL
User.order('RAND()')

# PostgreSQL
User.order('RANDOM()')

可以找到一个很好的衬垫,将阵列分成两半here

left, right = a.each_slice( (a.size/2.0).round ).to_a

答案 1 :(得分:0)

我会写一个会返回以下内容的定义

def randomizer(sample_size)
    initial_arr = ["objq","obj2", "objn"]
    sampler = initial_arr(sample_size)
    sampled_data = initial_arr - sampler  
end

这里sample_size将是数组想要随机化的大小,并根据您的数据大小分为50或100。

基本试用版我和

一样
[:foo, :bar, :hello, :world, :ruby].sample(3)

输出为[:hello,:ruby,:bar]。

第二个是[:foo, :bar, :hello, :world, :ruby] - [:foo, :bar, :hello, :world, :ruby].sample(3) [:hello, :world]

的结果

这样就可以避免循环遍历数组并更快地执行代码。

有关其他信息,请查看http://www.ruby-doc.org/core-2.1.1/Array.html#method-i-sample

这也可以在ruby 1.9.1中找到。

答案 2 :(得分:0)

您可以对查询结果执行基本的Array操作:

results = User.where(:condition => true)

首先使用shuffle使数组得到随机排序:

array = results.shuffle

然后slice数组大致相等:

group1 = array.slice(0..array.length/2)
group2 = array.slice(array.length/2+1..array.length)

如果订单很重要,sort组会回到初始订单:

group1.sort! {|a, b| results.index(a) <=> results.index(b) }
group2.sort! {|a, b| results.index(a) <=> results.index(b) }