php - ряд или последовательность случайных чисел

Полезные скрипты
Ответить
Аватара пользователя
mihas
Администратор
Сообщения: 1368
Зарегистрирован: 18 авг 2004, 16:58
Откуда: Москва
Контактная информация:

php - ряд или последовательность случайных чисел

Сообщение mihas »

Не сам придумал эту функцию но она хороша, в ней нет длительного подбора оставшегося случайного числа, когда почти все ячейки последовательности уже заполнены. Работает стало быть идеально быстро, у меня работает в цветовом тесте по циклу, подбирая последовательности из 10 цифр 360 тысяч раз (рисую стохастическими точками 36 картинок с дискретностью 2560 оттенка на канал для цветового теста). Все рисование 360 тысяч разных точек с этой функцией занимает у imagic 3-5 секунд. Поэтому важно, чтобы функция генерации случайных последовательностей была максимально быстрой - тут и без нее у скрипта забот хватает в четырех вложенных циклах с дополнительными счетчиками и четырехмерными массивами цветные точки расставлять (кстати, для справки, 6-мерные массивы у меня скрипт не потянул - пришлось ограничиться дополнительными счетчиками в циклах к четырехмерным массивам).
Вот функция, генерирующая случайную последовательность:

Код: Выделить всё

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;
}
Как видим количество цифр и содержание цифр управляются в параметрах вызова.
Вот вызов функции:

Код: Выделить всё

$selection=generateRandomSelection(0,9,10);
Где 0 и 9 первое и последнее число в случайной последовательности и 10 - количество чисел в последовательности. Получаем массив $selection из десяти случайно расположенных чисел от 0 до 9. Как вы догадываетесь это нужно для произвольной сортировки другого массива с количеством элементов равным 10. Мне нужно было произвольно расположить в массиве из 10 ячеек например три тройки и семь семерок. И приведенная выше функция очень помогла. Вначале создал двумя цикалами массив из последоватльно расположенных трех троек и семи семерок а потом перемешал. "Каша" из 360 тысяч таких массивов получилась и правда произвольная, видимых повторений нет, проверял графически.
Ответить

Вернуться в «PHP»