2017-01-25 5 views
0

Мне нужно создать случайное число в заданном диапазоне. Число должно отличаться для каждого нового месяца года, и оно не должно быть одинаковым (хотя теоретически это возможно) как число, сгенерированное годом ранее в течение данного месяца.Генерировать случайное число, которое меняется каждый месяц

Я думал об использовании функции php rand($min, $max) в сочетании с date("w"). Я борюсь с той частью, где мне нужно получать разные результаты за каждый год.

Для того, чтобы проиллюстрировать, что я имею в виду, проверить это:

$numbers = range(1, 100); //our random array 
echo $numbers[date("w")]; //date("w") returns number of week 

Есть 2 проблемы здесь: 1) это на самом деле не случайны, 2) число будет таким же, каждый год, и 3) он не отражают весь размер массива, так как дата («w») возвращает число от 1 до 52.

Как вы думаете, это возможно в чистом PHP? Или мне нужно сделать cronjob для этого?

Благодарим за помощь.

+1

Не могли бы вы просто сохранить случайный сгенерированный номер и каждый месяц создать новый? – freedev

+0

Да, я мог бы это сделать, но мне было интересно, есть ли способ, не сохранив его. Может быть, это немного сумасшедший tho;) – Adrenaxus

+1

Простой в принципе: hash значение 'date ('Ym')'. Это дает вам случайное значение для всех целей и целей, которое однозначно связано с текущим месяцем. Хэши обычно генерируют шестнадцатеричное или двоичное значение, поэтому вам просто нужно преобразовать базу в десятичную. Чтобы ограничить его в определенном диапазоне, примените некоторую операцию, например, модуль. – deceze

ответ

3

Вы можете использовать каждый месяц одинаковое число в семенах. Просто чтобы очистить семя в функции srand ([ int $seed ]).

Вы можете сделать что-то вроде этого:

srand(100); 
echo rand(); 

и каждый раз, когда она возвращает тот же номер. Поэтому каждый месяц вы можете сделать что-то вроде этого:

$min = 1; 
$max = 100; 
date_default_timezone_set('UTC'); 
$seed = date('Ym'); // it is the date as an integer 
srand($seed); 
echo rand($min, $max); 

Обратите внимание, чтобы установить часовой пояс по умолчанию. Если вы этого не сделаете, результат будет зависеть от конфигурации сервера.

- ОБНОВЛЕНИЕ -

Как @StevenSmith и @axiac заявил, что вы не 100% уверен, что случайное сгенерированное число является уникальным. Другими словами, это означает, что чем больше диапазон (min-max), тем выше вероятность того, что вы будете иметь каждый раз другое число.

+0

Будь то какой-то тяжелый материал, интересное решение, обязательно это проверяет! – Adrenaxus

+0

@freedev, устанавливает ли семя таким образом, чтобы каждый месяц давать уникальный номер? –

+0

@SteveSmith Ну, извините, не уникально. Random. Это означает, что если диапазон достаточно широк, вы почти уверены, что каждый раз он возвращает другое число. Пока я написал ответ, я понял разницу. – freedev

1

Используйте date('Ym'), чтобы создать уникальный идентификатор для каждой комбинации (год, месяц), использовать это значение, чтобы инициализировать двигатель псевдослучайного генератора затем генерировать одно случайное число:

srand(date('Ym')); 
$value = rand(1, 100); 

Adjust второй линии, чтобы соответствовать твои нужды. Теперь он генерирует целое число между (и включая) 1 и 100.

Значение, возвращаемое date('Ym'), одинаково в течение месяца. Каждый раз, когда вы вызываете srand() с определенным аргументом, псевдослучайный генератор повторно инициализируется с использованием этого значения, а затем он выдает одну и ту же последовательность псевдослучайных чисел при вызове rand() (несколько раз).

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

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

+0

Спасибо за ваш ответ, мне нравятся как ваши, так и решения @ freedev. Посмотрим. – Adrenaxus

0

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

Например, если случайное число равно 616, ближайший кратный 12 равен 612. Добавьте 0 (поскольку в настоящее время в январе), давая окончательный ответ 612. Это гарантирует, что число уникально для каждого месяца.

+1

Это требует, чтобы вы сохранили это число где-то, иначе вы не сможете его повторно использовать весь месяц. Если вы собираетесь сохранять номера в любом месте, есть более простые способы обеспечения уникальности. – deceze

Смежные вопросы