Autor Zpráva
__martin
Profil *
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
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 *
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
__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 *
_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
__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
_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
__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 *
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
__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é.

Vaše odpověď

Mohlo by se hodit

Příspěvky nesouvisející s webem budou odstraněny.

Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0