PHP rand () … получить результаты 50/50?

Я хочу запустить функцию, которая имеет 2 разных результата, но я хочу, чтобы каждый результат был действительно 50%. Я предполагаю, что ранд (0,1) – это путь, но мне любопытно, может ли это быть выгодно одному другому. Каков наилучший способ получить результат 50/50?

Благодарю.

EDIT: спасибо, ребята, я не хочу, чтобы это было случайным, хотя, я хочу, чтобы результат был 101010101, а не 111001101. Может быть, мне нужно просто обновить базу данных с последним значением вывода и затем вернуть противоположное?

EDIT2: ОК. Извините, мое последнее изменение вводило в заблуждение. Я только вызываю функцию один раз для каждого пользователя и назначая это значение как куки-файл для пользователя. Я хочу, чтобы каждый посетивший пользователь получил 1 или 0 в порядке 1010101.

В зависимости от конкретного контекста, в котором вы будете использовать это число (например, для каждого пользователя, время жизни приложения и т. Д.), Вы можете сохранить его в нескольких местах, $ _SESSION, значение базы данных или если только область охватывает только текущую страницу, то вы можете сохранить ее непосредственно в коде этой страницы.

Простым способом переключения значения является:

$val = 1 - $val; 

Для вызова базы данных:

 UPDATE YourTable SET `next_value` = 1 - `next_value` 

и т.д…

в PHP mt_rand() – лучший генератор случайных чисел

 mt_rand(0,1); 

Достаточно и должно генерировать довольно хорошее значение 50/50.

Цитата о mt_rand:

Многие генераторы случайных чисел старых libcs ​​имеют сомнительные или неизвестные характеристики и медленны. По умолчанию PHP использует генератор случайных чисел libc с функцией rand (). Функция mt_rand () является заменой для этого.

Он использует генератор случайных чисел с известными характеристиками с помощью «Mersenne Twister», который будет генерировать случайные числа в четыре раза быстрее, чем обеспечивает средний libc rand ().

У Билла была хорошая ссылка относительно визуального примера. Я не знаю, какой у PHP был пользователь для PHP, но поскольку он включил код, который я разместил на моем сервере (Linux с PHP 5.1.6)

  • rand () Визуальный пример
  • mt_rand () Визуальный пример

Ответ на отредактированный вопрос: если вы хотите поддерживать точное соотношение 50%, то случайность – это последнее, что вы хотите. Для ваших целей вы, вероятно, просто хотите назначить каждого нового пользователя (без обнаружения файлов cookie) автонабора из вашей базы данных, а затем дать ровную пронумерованную пользовательскую страницу, а другую страницу с нечетным номером (как это сделал RobS в комментарии).

 if( ($user_id % 2) == 0 ) // user id is even else // user id is odd 

Исходный ответ: функция rand () PHP не является особенно хорошим генератором псевдослучайных чисел (см. Простой иллюстративный пример ). Я бы порекомендовал mt_rand () .

Оба (rand () и mt_rand ()) возвращают хороший 50% / 50% шанс.

Вот пример:

 $array1 = array(0,0); $array2 = array(0,0); for ($x = 0; $x < 10000; $x++) { $array1[mt_rand(0,1)] ++; $array2[rand(0,1)] ++; } print_r($array1); print_r($array2); 

Результаты:

 Array 1 (mt_rand): [0] => 4910 [1] => 5090 Array 2 (rand): [0] => 4970 [1] => 5030 

По просьбе автора он хочет справедливого распространения. Поэтому попробуйте что-то вроде этого:

 $digits = 200; $array = array_fill(0, $digits/2, 0); for ($x = 0; $x < $digits/2; $x++) $array[] = 1; shuffle($array); 

Равное распределение и достаточно случайное. (Предлагается Брайаном)

Согласно руководству php, rand (0,1) – это путь. Но все зависит от того, насколько хорош генератор случайных чисел.

ничего действительно 50/50. Если вы хотите 50/50, тогда выполните функцию так, чтобы первые 5 результатов были равны 1, а остальные 5 – 2 и т. Д.

rand предназначен для генерации случайных чисел. Это означает, что он может дать в 10 раз один и тот же результат в строке, но это случайный случай.

Отказ от ответственности. Это глупая вещь для вашей конкретной проблемы, но если вы настаиваете на недоверии к генератору случайных чисел для равномерного распределения …

Классический алгоритм генерации aa 50/50 приводит к тому, что вы не доверяете равномерному распределению генератора следующим алгоритмом. Имейте в виду, что этот алгоритм больше предназначен для фиксации случайных чисел, чем псевдослучайные числа, и может на самом деле сделать результаты на основе мод хуже:

  1. Сгенерируйте два случайных бита A и B.
  2. Если A == B, перейти 1
  3. Возвращение B

Вы также можете гарантировать равное распределение, начиная с множества 1 и 0 (равномерно распределенных) и случайным образом перетасовывая их.

У RobS есть хорошее решение в комментариях, в основном говоря, что каждый пользователь может получить последовательный номер, а затем используя это число% 2, вы либо получите 0 или 1, что будет определять, какая страница будет обслуживаться. Конечно, даже это не гарантирует абсолютно точно соотношение 50/50 … это может быть странное количество людей!

Кроме того, в зависимости от того, как вы определяете пользователей, возможно, стоит проверить, что не существует какой-либо корреляции, которая могла бы дать даже число людей, которые с большей вероятностью приобретут … маловероятно, но просто что-то, о чем нужно помнить.

Для вас есть альтернативное решение, в котором вам не придется беспокоиться о неожиданных неожиданных корреляциях: на основе ваших комментариев и измененного вопроса вы просто пытаетесь провести справедливое сравнение между эффективностью двух разных макетов страниц, вы может просто разделить продажи макетов каждой страницы на количество раз, когда оно было случайно подано. т. е. вы используете генератор случайных чисел и отслеживаете, сколько раз он дает 0 для обслуживания страницы A, и сколько раз он дает 1 для обслуживания страницы B.

Скажем, вы сделали 50 000 долларов продаж на странице A с 43 хитами и 46 000 долларов продаж на странице B с 38 хитами, вы просто делаете математику …

 Page A Page B 50000 46000 ----- = 1163 $/hit ----- = 1211 $/hit 43 38 

Предоставление страницы B небольшое преимущество.

возможно, вы можете попробовать mt_rand (0,1) вместо rand (0,1)

Псевдо-случайность никогда не может быть истинной случайностью. Каждое вычисление случайных чисел на основе семени или другими средствами имеет определенный уровень предопределенности, который может появляться или не появляться очевидным образом – например, мини-шаблоны. Лучшее, на что можно надеяться, – это почти 50/50.

в то время как это псевдослучайный генератор, он никогда не достигнет 50/50 … read sth. о генераторах случайных чисел здесь: http://www.robertnz.net/true_rng.html

если вы просто хотите чередовать 1 и 0:

 $n = 0; $myval = ($n==1 ? $n=0 : $n=1); 

Если вы серьезно хотите, чтобы он возвращал противоположное значение на каждой итерации …

 function flip() { static $truthiness = false; $truthiness = !$truthiness; return $truthiness; } 

который должен возвращать true, false, true, false, true и т. д. …

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

Кроме того, если вы не знаете, что делает статическое ключевое слово, см. Инструкцию по PHP в области переменных .

Этот 10101010 не случайный, это шаблон.
result = not result

Это в ответ на ваш комментарий к вашему оригинальному сообщению:

Ваша цель – посмотреть, какая версия страницы генерирует больше продаж.

Это имеет смысл случайным образом показывать каждую страницу посетителю, чем перебрасывать ABABAB для каждого последующего посетителя.

Хотя я не могу представить себе никаких причин для систематического уклона с вашим методом, вы не можете это исключить. (далекий выбор сценария: некоторые следящие боты «следуют» пользователям на вашу страницу, и поэтому пользователь 1 получает A, бот получает B, пользователь 2 получает A, бот получает B и т. д.)

Достижение лучшей случайности более разумно при проведении такого исследования, как вы, а не в том, чтобы убедиться, что каждая страница отображается в точности в 50% случаев.