Autor | Zpráva | ||
---|---|---|---|
__martin Profil * |
#1 · Zasláno: 28. 8. 2010, 10:56:04
Ahoj,
potřeboval bych generovat náhodná čísla z normálního rozdělení. Nevíte o nějaké volně dostupné knihovně pro C#? Díky, Martin. |
||
Joker Profil |
#2 · Zasláno: 28. 8. 2010, 21:16:10
Na to snad není potřeba knihovna, akorát transformovat rovnoměrné rozdělení na normální. Google vyhodil tohle:
y1 = sqrt( - 2 ln(x1) ) cos( 2 pi x2 ) y2 = sqrt( - 2 ln(x1) ) sin( 2 pi x2 ) (x1 a x2 jsou dvě nezávislá náhodná čísla od 0-1 v rovnoměrném rozdělení, y1 a y2 dvě nezávislá náhodná čísla v normálním rozdělení) |
||
__martin Profil * |
#3 · Zasláno: 28. 8. 2010, 23:24:50
Díky moc.
implementoval jsem to v jazyce C# double x1 = random.NextDouble(); // returns number from 0.0 to 1.0 double x2 = random.NextDouble(); // returns number from 0.0 to 1.0 double y1 = Math.Sqrt(-2*Math.Log(x1))*Math.Cos(2*Math.PI*x2); double y2 = Math.Sqrt(-2*Math.Log(x1))*Math.Sin(2*Math.PI*x2); testoval jsem zatím jen y1 a vrací to i záporná čísla, nejvíc mě však zarazilo, že algoritmus generuje čísla až do "4.18786929310302" (zatím největší vygenerované číslo) |
||
_es Profil |
#4 · Zasláno: 28. 8. 2010, 23:55:03 · Upravil/a: _es
__martin:
Zrejme ti ten matematický pojem nie je celkom jasný. Pozri si napríklad na českej wikipédii Normální rozdělení. Ten graf tam predstavuje hustotu pravdepodobnosti. Teda pravdepodobnosť, že sa náhodné číslo nachádza v nejakom intervale, získaš tak, že spravíš integrál tej funkcie v tom intervale. A ten výsledok bude v rozsahu od 0 do 1. Integrál od -nekonečna do +nekonečna bude 1. Tvoju požiadavku "generovat náhodná čísla z normálního rozdělení" by si mal upresniť. |
||
__martin Profil * |
#5 · Zasláno: 29. 8. 2010, 00:49:05
_es:
Nějak jsem si měl pořád za to, že y1 a y2 musí být z intervalu od 0 do 1. Proto mě to trochu vyděsilo. Jestli tomu dobře rozumím, budu teď muset zintegrovat funkci normovaného (standardizovaného) normální rozdělení v intervalu od y1 do y2? Díky |
||
_es Profil |
#6 · Zasláno: 29. 8. 2010, 01:00:35 · Upravil/a: _es
__martin:
Normálne rozdelenie má určité vstupné parametre a až po ich zadaní do rovníc sa dá uvažovať o nejakom generovaní náhodných čísel zohľadňujúcich to rozdelenie. Viď ten článok na wikipédii. |
||
Bubák Profil |
#7 · Zasláno: 29. 8. 2010, 01:15:23
_es:
http://cs.wikipedia.org/wiki/Normální_rozdělení#Rozd.C4.9Blen.C3.AD_pravd.C4.9Bpodobnosti Rozdělení N(0,1) bývá označováno jako normované (nebo standardizované) normální rozdělení. Tomu odpovídá červená křivka v grafu: http://cs.wikipedia.org/wiki/Soubor:Normal_Distribution_PDF.svg |
||
_es Profil |
#8 · Zasláno: 29. 8. 2010, 01:39:32 · Upravil/a: _es
__martin:
„Nějak jsem si měl pořád za to, že y1 a y2 musí být z intervalu od 0 do 1.“ Ako som to pochopil ja, tak to je z intervalu od -nekonečno do +nekonečno a hodnoty okolo 0 sú najpravdepodobnejšie. Preto sa ťa vlastne stále pýtam čo pod "generovaním náhodných čísel z normálneho rozdelenia" vlastne rozumieš, prípadne na čo to chceš použiť. |
||
__martin Profil * |
#9 · Zasláno: 29. 8. 2010, 07:08:00
Ako som to pochopil ja, tak to je z intervalu od -nekonečno do +nekonečno a hodnoty okolo 0 sú najpravdepodobnejšie.
S tím souhlasím. Z integroval jsem funkci normálního normovaného rozdělení v intervalu y1 až y2 a všechny hodnoty jsou velice blízko nuly (0.000159930372422734, 0.0984600476160831, 0.304309377153706, 0.092602402820088...). Nevím, jestli to není spíš omyl nějaké náhody : ) Takže kdybych teď chtěl generovat náhodná čísla z intervalu od [0, 100], tak bych od čísla jedna odečetl výsledek integrace a vynásobil bych jej stem? tj (1-0.092602402820088)*100 = 90,72... ? Nejsem si přesně jist, co provést s transformovanými hodnotami (y1, y2). Díky |
||
_es Profil |
#10 · Zasláno: 29. 8. 2010, 08:21:32 · Upravil/a: _es
__martin:
„Nejsem si přesně jist, co provést s transformovanými hodnotami (y1, y2).“ Tie hodnoty z Jokerovno prepočtu sú náhodné dve hodnoty z normovaného (alebo štandardizovaného) normálneho rozdelenia. Teda to, čo si chcel, je to výsledok, dve vygenerované náhodné čísla. Na čo si to vlastne chcel, neviem, to by si mal vedieť ty a zatiaľ si to tu nenapísal. Zrejme to ešte upraviť na nejaké všeobecné normálne rozdelenie s nejakými parametrami, teda tie dve čísla nejakou konštantou vynásobiť a nejakú inú konštantu k tomu prirátať. Teda tú gausovu krivku "roztiahnuť" alebo "stiahnúť" a posunúť na x-ovej osi. Predtým som ťa možno trochu zmiatol, no teraz by to už snáď mohlo byť jasné. |
||
Časová prodleva: 14 let
|
0