Заранее прошу прощения за некропостинг, зарегистрировался только чтобы ответить в этой теме.
Хочу предложить универсальное решение по генерированию из строки случайного (но постоянного для нее) числа, с равномерным распределением вероятностей и возможностью задавать диапазон возвращаемых значений, от 0 до N. В итоге функция выглядит так:
/**
* Return random integer value (from 0 to N) for string, which is permanently CONST for this string.
*
* @param $str
* @param int $from_zero_to
* @param int $precision
*
* @return int
*/
function random_const_int($str, $from_zero_to = 9, $precision = 5) {
$str = (string)$str;
$num = base_convert(md5($str), 16, 10);
$num = round($num/3.4028236692093846346337460743177e+38, $precision);
$rand = round($num * $from_zero_to, $precision);
return (int)$rand;
}
/*
* TEST with probability distribution
*/
$m = [];
for($c = 0; $c < 20000; $c++)
@$m[random_const_int($c, 25)] += 1;
ksort($m);
echo '<pre>'. print_r($m, 1) . '</pre>';
die;
Результат выполнения:
Array
(
[0] => 834
[1] => 839
[2] => 791
[3] => 829
[4] => 802
[5] => 753
[6] => 803
[7] => 776
[8] => 776
[9] => 793
[10] => 763
[11] => 825
[12] => 864
[13] => 830
[14] => 788
[15] => 808
[16] => 834
[17] => 783
[18] => 728
[19] => 807
[20] => 760
[21] => 794
[22] => 810
[23] => 803
[24] => 807
)