【问题标题】:Is PHP mt_rand really random or possibly biased?PHP mt_rand 真的是随机的还是可能有偏见?
【发布时间】:2016-08-29 18:48:52
【问题描述】:

我在我的网站上做了两个基本的 A-B-C 测试

if(mt_rand(0,2) == 0){
//THROW IN RE HERE 
}elseif(mt_rand(0,2) == 1){
//THROW IN LR HERE
}else{
//THROW IN LB HERE
}

我预计这三种情况的发生频率相同(占所有网页浏览量的 33.3%)。但是,展示次数(由 Google Adsense 衡量)显示出非常不同的分布。有趣的是,两个测试(下面的两个图表)都显示出相似的模式:LB 出现最多,然后是 RE,然后是 LR。

样本量为数千,因此随机发生的可能性实际上为零。

我误解了 mr_rand() 吗?有谁知道它是否经过适当的测试?这些奇怪的模式怎么会出现?

【问题讨论】:

  • 您使用多少台服务器来托管您的网站?
  • 我认为 1. 我真的不知道。这有什么不同吗?
  • 如果负载均衡方法不统一,使用的服务器数量可能肯定会有所不同。您可能会从一台服务器获得不均匀的差异。此外,如果 Google Analytics 跟踪存在偏差(例如,在某些情况下不报告结果)。

标签: javascript php random adsense ab-testing


【解决方案1】:

您正在运行两次 mt_rand 测试。您有选项 0、1 和 2。如果测试为 0,则抛出 RE。如果不是,(即它是 1 或 2),您再次运行相同的测试,(再次使用选项 0、1 和 2)。在那里你测试1,如果是,你扔LR。如果不是(它是 0 或 2)你扔 LB。如果您需要,我可以进一步解释..

    $number = mt_rand(0,2);
    switch ($number){
     case 0:
       //do re
       break;
     case 1:
       //do lr
       break;
     case 2:
       //do lb
       break;
    }

或者这也可以完成这项工作

if(mt_rand(0,2) == 0){
//THROW IN RE HERE 
}elseif(mt_rand(0,1) == 1){ //we've stripped RE out, no longer deciding from 3 options
//THROW IN LR HERE
}else{
//THROW IN LB HERE
}

【讨论】:

  • ...当然...问题是我经常不止一次地绘制一个随机数,这不是我的意图。你的第一个建议正是我的目标。我还解释了为什么我之前的 A-B 测试运行良好。
【解决方案2】:

我不确定您究竟是如何通过 Google Adsense 收集数据的。您是否通过传入一些自定义变量来依赖 Google Analytics?如果是这样,肯定有其他因素导致与 PHP 无关的偏见。

为了测试均匀随机分布,我们可以在 PHP 中运行这样的测试。

$test = [0,0,0];
for($i = 0; $i < 100000; $i++) {
    $rand = mt_rand(0,2);
    $test[$rand]++;
}
var_dump($test);

这应该会给你这样的结果......

数组(3){ [0]=> 整数(33288) [1]=> 整数(33394) [2]=> 整数(33318) }

这表示您正在寻找超过 10 万次迭代的 33% 均匀分布。

请务必注意,mt_rand() 的实现是 PRNG(伪随机数生成器)而不是 CSPRNG(加密安全伪随机数生成器)。这意味着,它不太适合加密目的,但可以很好地满足其他 PRNG 需求。它基于Mersenne Twister,因为它比libc rand() 更快。尽管我不认为您在数据中发现的任何问题都可能是 PHP 实现 mt_rand() 的直接结果。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-21
    • 2016-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-06
    • 2016-11-07
    相关资源
    最近更新 更多