В качестве приложения к теме http://php.ru/forum/viewtopic.php?p=71709#71709 Функция, генерирующая равномерно распределенный случайный набор чисел без повторов из заданного диапазона. $min, $max - границы диапазона, $count - количество генерируемых значений. Диапазон может быть любым, скорость алгоритма от него не зависит. Если диапазона недостаточно для генерации $count различных значений, возвращается столько значений, сколько их оказалось в диапазоне. PHP: <?php // by Dagdamor function generateRandomSelection($min, $max, $count) { $result=array(); if($min>$max) return $result; $count=min(max($count,0),$max-$min+1); while(count($result)<$count) { $value=rand($min,$max-count($result)); foreach($result as $used) if($used<=$value) $value++; else break; $result[]=$value; sort($result); } shuffle($result); return $result; } Примеры использования: PHP: <?php // Выбрать 5 различных случайных значений из диапазона [1-1000] $selection=generateRandomSelection(1,1000,5); echo implode(", ",$selection)."<br>"; // 824, 704, 21, 370, 385 // Выбрать 10 различных случайных значений из диапазона [1-10] $selection=generateRandomSelection(1,10,10); echo implode(", ",$selection)."<br>"; // 3, 1, 4, 10, 7, 9, 5, 6, 2, 8 // Выбрать 3 различных случайных значения из диапазона [1-10] $selection=generateRandomSelection(1,10,3); echo implode(", ",$selection)."<br>"; // 6, 4, 9 // Выбрать 10 различных случайных значений из диапазона [1-3] $selection=generateRandomSelection(1,3,10); echo implode(", ",$selection)."<br>"; // 1, 3, 2
Вот ещё решение http://ru2.php.net/manual/ru/function.rand.php#77065 PHP: <?php function randiff($min, $max, $num) { if ($min<$max && $max-$min+1 >= $num && $num>0) { $random_nums = array(); $i=0; while($i<$num) { $rand_num = rand($min, $max); if (!in_array($rand_num, $random_nums)) { $random_nums[] = $rand_num; $i++; } } return $random_nums; } else { return false; } } ?>
если уж читерить, так по полной PHP: <?php function randiff( $min, $max, $num ){ return array_slice( shuffle( range( $min, $max ) ), 0, $num ); } ?>
Sergey89 Это нелинейный алгоритм, в случае, когда мы выбираем 100 чисел из 100 и уже набрали 99, функция будет долбиться по интервалу снова и снова, пока случайно не попадет в свободное значение. Я специально стремился этого избежать в своем варианте dark-demon Твой вариант будет тормозить (либо не пройдет по памяти), если $max-$min - достаточно большое число.
"угадай источник". том 2, глава 3 - случайные числа, пункт 3.4.2 - случайные выборки и перемешивания, алгоритм s: PHP: <?php /** 0 < n <= N выбор n случайных чисел из диапазона 1..N t - текущее число m - количество выбранных чисел */ function rand_selection ($n, $N) { $res = array (); for ($t = 1, $m = 0; $m < $n; $t++) { if (rand (0, $N - $t) < $n - $m) { $res[] = $t; $m++; } } return $res; } ?>