Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
1-1105390312
vertal
2005-01-10 23:51
2005.01.30
Возбуждение исключения в другом потоке


1-1105513028
leonidus
2005-01-12 09:57
2005.01.30
Контекстный переход внутри chm-справки


14-1105318117
Alex_Petr
2005-01-10 03:48
2005.01.30
Устал за ;$1600 пить в одиночку


1-1105961154
Dimon 33321
2005-01-17 14:25
2005.01.30
Полупрозрачный TButton


1-1105689488
Mishenka
2005-01-14 10:58
2005.01.30
Как узнать сколько дней в месяце соответствующему текущей дате?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский