我正在进行AB测试,需要划分人口。我应该如何划分类似的东西
User.where(:condition => true)
随机分成两组大致相同的组?
我正在考虑遍历整个数组并根据随机值推送到另外两个数组中的一个,但这是一个很大的查询,听起来很慢。
e.g。
array.each do |object|
if rand(2) == 0
first_group << object
else
second_group << object
end
end
答案 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) }