Python A/B测试算法

Python A/B测试算法,python,mysql,python-2.7,Python,Mysql,Python 2.7,我需要为我的用户开发A/B测试方法。基本上,我需要将我的用户分成若干组,例如40%和60%。 我有大约10万用户,我需要知道什么是我最好的方法。随机数不是一个选项,因为用户每次都会得到不同的结果。我的第二个选择是修改我的数据库,以便每个用户都有一个预定义的数字(随机生成)。消极的一面是,如果我得到50,例如,我将始终拥有该数字,除非我创建一个新用户。我不介意,但我不确定更改数据库是否是一个好主意 还有其他解决方案可以避免吗?针对主键运行一个简单的算法。例如,如果用户id有一个整数,则用偶数和奇数

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


还有其他解决方案可以避免吗?

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


如果需要两个以上的组,请使用mod函数。

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


如果您需要两个以上的组,请使用mod函数。

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

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。您还可以修改它以使用浮动,这将给您带来更大的灵活性。

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

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的辅助表。您不需要更改现有的表,如果需要,可以很容易地更改每个类的百分比。它的侵入性很小。

我会添加一个只包含userId和A/B的辅助表。您不需要更改现有表,如果需要,可以很容易地更改每个类的百分比。它的侵入性非常小。

您可以使用there用户id设置不同存储桶中的用户吗?1000,00是什么类型的数字?您可以使用there用户id设置不同存储桶中的用户吗?1000,00是什么类型的数字?这太完美了。正是我需要的。无需在用户登录时一次完成所有操作。我还远远没有一次拥有100万的在线用户。不管是哪种方式,在一个8gb内存的quad i7上只需3秒钟就可以完成。谢谢一件真正的艺术品,亚历山大!我根据您的工作制作了一个带有单元测试的小框架,并将您的名字添加到学分中:谢谢!太好了。正是我需要的。无需在用户登录时一次完成所有操作。我还远远没有一次拥有100万的在线用户。不管是哪种方式,在一个8gb内存的quad i7上只需3秒钟就可以完成。谢谢一件真正的艺术品,亚历山大!我根据您的工作制作了一个带有单元测试的小框架,并将您的名字添加到学分中:谢谢!