2016-06-17 6 views
0

В PHP я могу это сделать:PHP число между интервалом в зависимости от входной строки

echo rand(5, 15); 

Это даст мне число между 5 и 15, каждый раз разные.

Статическое число в зависимости от входной строки

echo my_static_number(5, 15, 'some/custom_string'); 

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

  • Разрешенные номера вывода 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15
  • То же самое количество каждый раз, до тех пор, как вызов функции остается неизменным.

Реальные примеры

Изображения в папке:

1.jpg 
2.jpg 
3.jpg 
etc. 

Php вызова:

<img src="<?php echo get_image(1, 15, $url); ?>"> 
<img src="<?php echo get_image(1, 15, $url); ?>"> 

выход что-то вроде этого:

<img src="7.jpg"> 
<img src="7.jpg"> 

Такое же количество раз, пока вызов функции тот же.

+0

Вы можете вызвать функцию 'rand()', а затем сохранить возвращенный номер с уникальным идентификатором (например, ваш '$ url'), а затем перед другим вызовом' rand() 'вы можете проверить, если для этого rand уже есть число. – pes502

+0

Должна ли эта работа работать на общем основании или только на одно исполнение скрипта? – Yoshi

+0

@Yoshi Он не должен генерировать разные результаты при разном исполнении. Тот же результат, если вызов функции с аргументами одинаковый. –

ответ

2

Я ожидаю, что вы создадите балансировщик нагрузки.

Что нужно здесь, чтобы вычислить hash из строки и преобразовать их в число. Хорошей псевдослучайной хэш-функции будет достаточно, чтобы получить случайное распределение.Одним из решений может быть как это:

function my_static_number($a, $b, $str) { 
    $hash = hash('crc32', $str); // crc32 is probably the fastest here 
    $dec = hexdec($hash); // convert hash to a decimal value 
    $base = $b + 1 - $a; // +1 is needed to include $b as possible value 
    return $a + fmod($dec, $base); // get remainder from $dec/$base 
} 

Некоторые тесты на teh playground:

Update: Там может быть небольшое улучшение в скорости, если вы берете первые 2 символа на $hash вместо, а затем использовать $dec % $base вместо fmod:

function my_static_number($a, $b, $str) { 
    $hash = substr(hash('crc32', $str), 0, 2); // effectively produces a number between 0 and 255 
    $dec = hexdec($hash); 
    $base = $b + 1 - $a; 
    return $a + $dec % $base; 
} 

Я сделал тест на случайное распределение и обе функции делают reasonably well.

+0

Пробовал. Прекрасно работает! Какие-то подводные камни? –

+0

Я думаю, что это может иметь некоторое улучшение скорости, если вы берете только первые 2 символа '$ hash', а затем можете использовать остаток на основе целых чисел:' $ dec% $ base' вместо 'fmod'. Это должно быть немного быстрее. Что касается случайности - теоретически это должно быть случайным, но я не проводил надлежащих тестов. –

2

Это то, что я думал, когда я прочитал Ваш вопрос:

function my_static_number($min,$max,$seedStr) 
{ 
    $hash = md5($seedStr); 
    $length = strlen($hash); 
    $seed = 1234; 
    for ($i=0; $i<$length; $i++) $seed += ord($hash[$i]); 
    srand($seed); 
    return rand($min,$max); 
} 


echo my_static_number(5, 15, 'some/custom_strings'); 

rand() может быть посеян, и с тем же семени, он будет генерировать ту же случайную последовательность. Итак, я использую полную строку, добавляю значения ascii этого хэша и использую это как семя.

Итак, вы получите случайные числа, но они будут одинаковыми для одних и тех же строк семян.

Эта функция имеет некоторые ограничения:

  • скорость: Это не самый быстрый. Если это необходимо, вам нужен совершенно другой алгоритм.
  • случайность: есть небольшое снижение случайности выхода из-за ограниченного количества значений семян. Это можно улучшить.

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

function my_static_number($min,$max,$seedStr) 
{ 
    $hash = md5($seedStr); 
    $length = strlen($hash); 
    $number = 1234; 
    for ($i = 0;$i < $length;$i++) $number += ord($hash[$i]); 
    return $min + ($number % ($max-$min)); 
} 

echo my_static_number(5, 15, 'some/custom_string'); 
+0

Вы можете использовать [crc32] (http://www.php.net/crc32) для создания целочисленного хэша из строки. – Furgas

+0

Он работает! Большой! Если у вас есть время и вы хотите, чтобы вы могли попробовать вычислить хэш. UPDATE: Другие решения, входящие в систему, также будут проверять их. –

+1

Ну, я где-то попал, не так ли? :-) –