Форум колористов и полиграфистов
https://cielab.xyz/forum/

php - ряд или последовательность случайных чисел
https://cielab.xyz/forum/viewtopic.php?f=15&t=507
Страница 1 из 1

Автор:  mihas [ 16:23, Сб, 23 мар 2013 ]
Заголовок сообщения:  php - ряд или последовательность случайных чисел

Не сам придумал эту функцию но она хороша, в ней нет длительного подбора оставшегося случайного числа, когда почти все ячейки последовательности уже заполнены. Работает стало быть идеально быстро, у меня работает в цветовом тесте по циклу, подбирая последовательности из 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 тысяч таких массивов получилась и правда произвольная, видимых повторений нет, проверял графически.

Страница 1 из 1 Часовой пояс: UTC+03:00
Powered by phpBB® Forum Software © phpBB Limited
https://www.phpbb.com/