Является ли PHP mt_rand действительно случайным или, возможно, предвзятым?

Я сделал два основных теста 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 ()? Кто-нибудь знает, был ли он должным образом проверен? Как еще могут появиться эти странные паттерны?

введите описание изображения здесь

4

Решение

Вы запускаете mt_rand test дважды … у вас есть опция 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
}
4

Другие решения

Я точно не знаю, как вы собираете данные через Google Adsense. Вы полагаетесь на Google Analytics, передавая какой-то пользовательский var? Если так, то определенно могут быть другие факторы, вызывающие предвзятость, которые не имеют ничего общего с PHP.

Чтобы проверить равномерное случайное распределение, мы можем запустить такой тест в PHP.

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

Что должно дать вам такие результаты …

массив (3) {
[0] =>
Int (33288)
[1] =>
Int (33394)
[2] =>
Int (33318)
}

Это указывает на 33% равномерное распределение, которое вы ищете для более чем 100K итераций.

Важно отметить, что реализация mt_rand() является PRNG (генератором псевдослучайных чисел), а не CSPRNG (криптографически безопасным генератором псевдослучайных чисел). Это означает, что он не очень подходит для криптографических целей, но отлично работает для других нужд PRNG. Это основано на Мерсенн Твистер потому что это быстрее, чем libc rand(), Хотя я не думаю, что какие-либо проблемы, которые вы обнаружите здесь в своих данных, могут быть прямым результатом реализации PHP mt_rand(),

3

По вопросам рекламы [email protected]