Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

как сделать рандом с уклоном? [D7]


Top ©   (2005-10-06 16:08:00) 

как сделать рандом с уклоном? чтобы например были числа от 1 до 40 но большие выпадали несколько реже.


GuAV   (2005-10-06 21:58:00) [1]

Ясно. Спасибо.


Jeer   (2005-10-06 18:48:00) [2]

MBo ©   (06.10.05 17:13) [8]

Так и называется "метод обратных функций"

Если не удается получить аналитическое выражение, то используются различного рода аппроксимации.
Бусленко Н.П. был разработан метод кусочно-линейной аппр.

Еще есть метод "отбора" - предложен  Дж.Нейманом.
Известен метод "суперпозиции" -  Butler J.W. (1956)
а также их комбинации.


MBo   (2005-10-06 17:13:00) [3]

>GuAV ©   (06.10.05 16:50) [7]
Да, есть, преобразованием Смирнова (того, чей с Колмогоровым критерий в статистике известен)

Если можно проинтегрировать функцию, и взять от интеграла обратную функцию, то последнюю применяют для преобразования равномерно распределенного случайного числа.

Пример: нужно экспоненциальное распределение Exp(-x)
Интеграл -  -Exp(-x)
обратная функция -  -Ln(Y)
Значит, Rnd:=-Ln(Random); // где Random 0..1 (не включая границы)
даст экспоненциальное распределение (затухающее)


GuAV   (2005-10-06 16:50:00) [4]

Кстати, есть ли способ получить случайное число, зная плотность распределения ?


Top   (2005-10-06 16:32:00) [5]


> MBo ©

отлично, это мне подходит :) спасибо


MBo   (2005-10-06 16:27:00) [6]

Квадратичное распределение:
Rnd:=1+Max(Random(40),Random(40));


Top   (2005-10-06 16:21:00) [7]

спасибо щас попробую предложенные решения


Defunct   (2005-10-06 16:17:00) [8]

Top ©   (06.10.05 16:08)  

if Random( 9 ) < 8 then  // тут задаем вероятность выпадания большого числа
 Result := 1 + Random( 39 )
else
 Result := 1 + Random( 1000 )


MBo   (2005-10-06 16:15:00) [9]

>но большие выпадали несколько реже.
Насколько реже?
Т.е. какого вида должно быть распределение (плотность распределения)


evvcom   (2005-10-06 16:14:00) [10]

Например, создаешь массив из 70 элементов. Первые 60 заполняешь числами от 1 до 30 по 2 раза каждое, остальные от 31 до 40 по 1 разу. Делаешь random в диапазоне 1-70 (или 0-69) и из массива по этому индексу выбираешь значение. Таким образом числа от 31 до 40 будут выпадать несколько реже, чем 1-30. :) Получить можешь любое распределение.


Наверх

Титульная страница Поиск, карта сайта Написать письмо