50-50 A/B 测试的不同算法

问题描述 投票:0回答:1

我们正在对网络应用客户运行 A/B 测试,给定一个 customerId。每个客户都会看到不同的细微 UX 更改。 试图阻止使用功能标志,因为它目前尚未在我们的系统中设置。

最初我们在 CustomerId 号码上尝试 Even-Odd,50-50% 的比例来测试 Feature 1。示例 UserId 4 是偶数,7 是奇数。 但是,在测试另一个特征 2 时,执行奇偶 50-50% 会使特征 1 组与特征 2 具有匹配组,因为它们共享相同的算法。

什么是另一种数学算法方法,运行哈希或 50-50% 算法,所以我可以区分? 我们可能要测试 10 个特征,因此需要一种方法在特征标志算法中添加一个参数,并将在文档表中进行跟踪。

顺便说一句,我们正在使用 Javascript/Typescript 分配组。

注意:组应该是稳定的而不是随机的,例如奇偶会给出一致的结果。

testing architecture software-design ab-testing
1个回答
0
投票

为了为每个客户 ID 和功能编号获得一致且非随机的组分配,您可以考虑使用以下组:

  • 哈希 + 模数

    我们可以利用一个简单的哈希函数将客户ID统一分配,然后应用取模运算将它们分组。

    • 我们会将客户 ID 与功能编号一起散列。
    • 然后用一个大素数对结果进行修改,以帮助确保均匀分布。
    • 之后我们用mod 2分成两组
    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';
    }
    
© www.soinside.com 2019 - 2024. All rights reserved.