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

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

Распределение случайных чисел


Putnik ©   (2005-01-19 14:28:00) 

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


default   (2005-01-19 16:04:00) [1]

вообщем почти тоже самое что [8]
так можно было бы делать если бы Random давал только цеоые числа


default   (2005-01-19 15:49:00) [2]

+[9]
можно обойтись одним вызовом рандома
допустим 1 выпадает с вероятностью 0.255, 2 с вероятностью 0.5 и 3 с вероятностью 1-(0.255+0.5)=0.245
0.255=255/1000, 0.245=245/1000, 0.5=(100/100)(5/10)=500/1000
делаем рандом Random(1000) и сопоставляя, к примеру, первые 255 чисел рандома выпадению единицы, следующие 245 выпадению двойки и остальные выпадению тройки делаем вывод какое число выпало
вот и всё)


default   (2005-01-19 15:20:00) [3]

Putnik   (19.01.05 15:09) [7]
я думал для одного надо
но можно и для всех адапатировать
разыгрываем первое число если оно не выпало значит выпало какое-то другое, теперь разыгрываем второе число, если оно не выпало - третье и тд


Putnik   (2005-01-19 15:16:00) [4]

В общем это наверное так
x,p -массивы

l:=lenght(x);
a:=random(1);
i:=1;
s:=p[i];
while s<a do
begin
inc(i);
s:=s+p[i];
end;
result:=x[i];


Putnik   (2005-01-19 15:09:00) [5]

А если у меня 5 пар число-вероятность, то такой подход не учитывает, что эти события взаимоисключающи.


default   (2005-01-19 15:08:00) [6]

блин, сильно тороплюсь
" то есть если Random(b)>a-1 то заданное действительное число не выпало, иначе выпало"


default   (2005-01-19 15:05:00) [7]

Putnik   (19.01.05 14:28)
поскольку число разрядов под действительное число представляемое вероятность конечно, то можно считать его рациональнымчислом, это многое даёт
то есть такое число которое представимо ввиде a/b, где
a < b, и оба они - натуральные числа
значит для генерации заданного числа с заданной рациональной вероятностью достаточно выполнить строку Random(b)
считая исходами благоприятсвующими наступлению заданного события(получению данного действительного числа), например, первые aчисел генерируемых рандомом
то есть если Random(b)>a-1 то заданное действительное число выпало
вот и всё


default   (2005-01-19 15:03:00) [8]

Putnik   (19.01.05 14:28)
поскольку число разрядов под действительное число представляемое вероятность конечно, то можно считать его рациональнымчислом, это многое даёт
то есть такое число которое представимо ввиде a/b, где
a < b, и оба они - натуральные числа
значит для генерации заданного числа с заданной рациональной вероятностью достаточно выполнить строку Random(b+1)
считая исходами благоприятсвующими наступлению заданного события(получению данного действительного числа), например, первые aчисел генерируемых рандомом
то есть если Random(b)>a-1 то заданное действительное число выпало
вот и всё
если вероятности есть рациональные чи


Putnik   (2005-01-19 15:00:00) [9]

Спасибо большое! Наверное, так действительно правильней


Digitman   (2005-01-19 14:44:00) [10]

for или repeat..until вряд ли более изящные способы, но без цикла здесь вряд ли обойтись

посмотри на станд.ф-цию генератора ПСП с гауссовым распределением

function RandG(Mean, StdDev: Extended): Extended;
{ Marsaglia-Bray algorithm }
var
 U1, S2: Extended;
begin
 repeat
   U1 := 2*Random - 1;
   S2 := Sqr(U1) + Sqr(2*Random-1);
 until S2 < 1;
 Result := Sqrt(-2*Ln(S2)/S2) * U1 * StdDev + Mean;
end;

как видишь, Борланд реализовал это именно в цикле


Kerk   (2005-01-19 14:38:00) [11]

Вероятность получения значения считай диапазоном.
Получи одно случайное число [0,1) и смотри в какой по счету диапазон оно попало.


Наверх

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