Рэнд PHP () … получает истинные результаты 50/50?

Вот версия, использующая более новый расширенный синтаксис :

const concrete_cylinders = [
  {
    id: '',
    specimen_name: 'A',
    mould_number: '',
    curing: '1',
    age: '7'
  },
  {
    id: '',
    specimen_name: 'A',
    mould_number: '',
    curing: '1',
    age: '7'
  },
  {
    id: '',
    specimen_name: 'A',
    mould_number: '',
    curing: '1',
    age: '7'
  }
]

const result = concrete_cylinders.map(o => ({
  ...o,
  ...{
    curing: parseInt(o.curing),
    age: parseInt(o.age)
  }
}));

console.log(result);

8
задан JD Isaacks 18 March 2009 в 14:33
поделиться

15 ответов

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

Простой способ переключить значение:

$val = 1 - $val;

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

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

и т.д...

2
ответ дан 5 December 2019 в 04:36
поделиться

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

mt_rand(0,1);

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

Кавычка о mt_rand:

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

Это использует генератор случайных чисел с известными характеристиками с помощью» вихря Мерсенна, который произведет случайные числа в четыре раза быстрее, чем, что обеспечивает среднее число libc рэнд ().

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

30
ответ дан 5 December 2019 в 04:36
поделиться

Оба (рэнд () и 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);

Равное распределение и достаточно случайный. (Предложенный Brian)

2
ответ дан 5 December 2019 в 04:36
поделиться

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

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

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

10
ответ дан 5 December 2019 в 04:36
поделиться

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

1
ответ дан 5 December 2019 в 04:36
поделиться

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

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

1
ответ дан 5 December 2019 в 04:36
поделиться

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

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

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

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

1
ответ дан 5 December 2019 в 04:36
поделиться

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

0
ответ дан 5 December 2019 в 04:36
поделиться

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 небольшое преимущество.

1
ответ дан 5 December 2019 в 04:36
поделиться

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

0
ответ дан 5 December 2019 в 04:36
поделиться

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

0
ответ дан 5 December 2019 в 04:36
поделиться

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

$n = 0;
$myval = ($n==1 ? $n=0 : $n=1);
0
ответ дан 5 December 2019 в 04:36
поделиться

Если Вы серьезно хотите, чтобы это возвратило противоположное значение на каждом повторении...

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

который должен возвратить true, ложь, верную, ложную, верную, и т.д...

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

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

0
ответ дан 5 December 2019 в 04:36
поделиться

Это в ответ на Ваш комментарий к Вашему исходному сообщению:

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

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

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

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

0
ответ дан 5 December 2019 в 04:36
поделиться

Это 10101010 не случайно, это - шаблон.
закончитесь = не, заканчиваются

0
ответ дан 5 December 2019 в 04:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: