Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.01.30;
Скачать: CL | DM;

Вниз

Распределение случайных чисел   Найти похожие ветки 

 
Putnik   (2005-01-19 14:28) [0]

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


 
Kerk ©   (2005-01-19 14:38) [1]

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


 
Digitman ©   (2005-01-19 14:44) [2]

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;

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


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

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


 
default ©   (2005-01-19 15:03) [4]

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


 
default ©   (2005-01-19 15:05) [5]

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


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

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


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

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


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

В общем это наверное так
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];


 
default ©   (2005-01-19 15:20) [9]

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


 
default ©   (2005-01-19 15:49) [10]

+[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 16:04) [11]

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



Страницы: 1 вся ветка

Текущий архив: 2005.01.30;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.051 c
4-1102491726
Sigetta
2004-12-08 10:42
2005.01.30
EnumChildWindow


1-1105369784
Sicilla
2005-01-10 18:09
2005.01.30
TListView


1-1106136747
igor_buz
2005-01-19 15:12
2005.01.30
Как определить какая процедура вызвала открытие формы?


4-1102587212
Alexius
2004-12-09 13:13
2005.01.30
Как узнать, какая программа обращается к COM порту?


1-1105701891
Leon1
2005-01-14 14:24
2005.01.30
Настройка DbGrid