A/B测试算法



我需要为我的用户开发一个A/B测试方法。基本上我需要把我的用户分成若干组——例如40%和60%。
我有大约10万名用户,我需要知道我的最佳方法是什么。随机数不是一个选择,因为用户每次都会得到不同的结果。我的第二个选择是修改数据库,以便每个用户都有一个预定义的数字(随机生成)。消极的一面是,如果我得到50,我将一直拥有这个数字,除非我创建一个新用户。我不介意,但我不确定修改数据库是不是一个好主意。

是否有其他解决方案可以避免这种情况?

对主键运行一个简单的算法。例如,如果用户id是一个整数,用偶数和奇数分隔。

如果需要2个以上的组,使用mod函数

你正在使用MySQL,所以这是不是一个好主意,很难说。修改数据库可能代价高昂。此外,从长远来看,如果它开始变大,可能会影响性能。此外,您还必须修改系统,以便在每个新用户的数据库中包含该号码。你把这个问题标记为python问题。这里有另一种不需要对数据库做任何改变的方法。由于您讨论的是用户,因此您可能对所有用户都有一个惟一标识符,比方说电子邮件。我将使用uuid代替email。

import hashlib
def calculateab(email):
        maxhash = 16**40
        emailhash = int(hashlib.sha1(email).hexdigest(), 16)
        div = (maxhash/100)-1
        return int(float(emailhash/div))

#A small demo
if __name__ == '__main__':
        import uuid, time, json
        emails = []
        verify = {}
        for i in range(1000000):
                emails.append(str(uuid.uuid4()))
        starttime = time.time()
        for i in emails:
                ab = calculateab(i)
                if ab not in verify:
                        verify[ab] = 1
                else:
                        verify[ab] += 1
        #json for your eye's pleasure
        print json.dumps(verify, indent = 4)
        #if you look at the numbers, you'll see that they are well distributed so 
        #unless you are going to do that every second for all users, it should work fine
        print "total calculation time {0} seconds".format((time.time() - starttime))

与python关系不大,更像是一个数学解决方案。你可以使用md5, sha1或者任何类似的东西,只要它有固定的长度并且是十六进制数。第6行的-1是可选的,它将范围设置为0到99,而不是1到100。你也可以修改为使用浮点数,这会给你更大的灵活性。

我会添加一个辅助表,只有userId和A/B。您不需要更改存在的表,如果需要,可以很容易地更改每个类的百分比。

这是JS的一行代码:

const AB = (str) => parseInt(sha1(str).slice(0, 1), 16) % 2 === 0 ? 'A': 'B';

和1000万封随机邮件的结果:

{A: 5003530, B: 4996470}

最新更新