![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
как сделать рандом с уклоном? [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. :) Получить можешь любое распределение.