はじめに
ABテストのために組んだスクリプトの精度を計算してみた。
問題
本当に50%で結果が出るのか文献が見つからなかったので。
(というか探すより自分で調べたほうが早い)
解決方法
下記を実行するのみ。
test.php
<?php
function testRandomness($arr, $trials = 1000) {
$results = [
'count0' => 0,
'count1' => 0
];
for ($i = 0; $i < $trials; $i++) {
$result = mt_rand(...$arr);
if ($result < $arr[1]/2) {
$results['count0']++;
} else {
$results['count1']++;
}
}
return $results;
}
// 試行回数を指定して関数を実行
$trials = 1000000; // ここで試行回数を指定
$results = testRandomness([0,1],$trials);
echo "試行回数: $trials\n";
echo "0の割合: " . ($results['count0'] / $trials * 100) . "%\n";
echo "1の割合: " . ($results['count1'] / $trials * 100) . "%\n";
$results = testRandomness([0,1000],$trials);
echo "試行回数: $trials\n";
echo "0の割合: " . ($results['count0'] / $trials * 100) . "%\n";
echo "1の割合: " . ($results['count1'] / $trials * 100) . "%\n";
$results = testRandomness([0,100000],$trials);
echo "試行回数: $trials\n";
echo "0の割合: " . ($results['count0'] / $trials * 100) . "%\n";
echo "1の割合: " . ($results['count1'] / $trials * 100) . "%\n";
結果
50%といって良さそうな気がします。
0,1 | 0,1000 | 0,100000 | |
---|---|---|---|
n1 | 0の割合: 49.945% 1の割合: 50.055% |
0の割合: 49.9088% 1の割合: 50.0912% |
0の割合: 50.0147% 1の割合: 49.9853% |
n2 | 0の割合: 49.9824% 1の割合: 50.0176% |
0の割合: 49.9858% 1の割合: 50.0142% |
0の割合: 49.9405% 1の割合: 50.0595% |
n3 | 0の割合: 50.0394% 1の割合: 49.9606% |
0の割合: 49.9034% 1の割合: 50.0966% |
0の割合: 49.9573% 1の割合: 50.0427% |
参考