Форум: "Основная";
Текущий архив: 2005.01.30;
Скачать: [xml.tar.bz2];
ВнизРаспределение случайных чисел Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.036 c