我们正在对网络应用客户运行 A/B 测试,给定一个 customerId。每个客户都会看到不同的细微 UX 更改。 试图阻止使用功能标志,因为它目前尚未在我们的系统中设置。
最初我们在 CustomerId 号码上尝试 Even-Odd,50-50% 的比例来测试 Feature 1。示例 UserId 4 是偶数,7 是奇数。 但是,在测试另一个特征 2 时,执行奇偶 50-50% 会使特征 1 组与特征 2 具有匹配组,因为它们共享相同的算法。
什么是另一种数学算法方法,运行哈希或 50-50% 算法,所以我可以区分? 我们可能要测试 10 个特征,因此需要一种方法在特征标志算法中添加一个参数,并将在文档表中进行跟踪。
顺便说一句,我们正在使用 Javascript/Typescript 分配组。
注意:组应该是稳定的而不是随机的,例如奇偶会给出一致的结果。
为了为每个客户 ID 和功能编号获得一致且非随机的组分配,您可以考虑使用以下组:
哈希 + 模数:
我们可以利用一个简单的哈希函数将客户ID统一分配,然后应用取模运算将它们分组。
function hashCode(customerId, featureNum) {
const str = customerId.toString() + featureNum.toString();
let hash = 0;
for (let i = 0; i < str.length; i++) {
const char = str.charCodeAt(i);
hash = ((hash << 5) - hash) + char;
hash |= 0; // Convert to 32bit integer
}
return hash;
}
function assignGroup(customerId, featureNum) {
const largePrime = 15485863; // Just an example, choose any large prime number
const hash = hashCode(customerId, featureNum);
return ((hash % largePrime) % 2) === 0 ? 'A' : 'B';
}
XOR,使用客户 ID 和功能编号的组合。
function assignGroup(customerId, featureNum) {
return (((customerId ^ featureNum) + 1) % 2) === 0 ? 'A' : 'B';
}
Sum of Digits,将客户ID和特征号的数字和,并使用结果对客户进行分组:
function sumOfDigits(number) {
let sum = 0;
while (number) {
sum += number % 10;
number = Math.floor(number / 10);
}
return sum;
}
function assignGroup(customerId, featureNum) {
return (sumOfDigits(customerId + featureNum) % 2) === 0 ? 'A' : 'B';
}