Pot't obține capul meu în jurul valorii de acest lucru, care este mai mult o întâmplare?
rand()
SAU
rand() * rand()
Am´m constatare este un teaser creier adevărat, ai putea să mă ajuți?
EDIT:
Intuitiv am știut că matematice răspunsul va fi că ele sunt la fel de aleatoare, dar nu pot't ajuta, dar cred că, dacă "rula număr aleator algoritm" de două ori atunci când vă înmulțiți două împreună'll crea ceva mult mai aleatoriu decât a face doar o dată.
Deși răspunsurile precedente sunt corecte ori de câte ori încercați să fața locului aleatoriu dintr-o pseudo-variabila aleatoare sau multiplicarea sa, ar trebui să fie conștienți de faptul că în timp ce Random() este de obicei distribuit uniform, *Random() Random()** nu este.
Aceasta este o uniformă repartizare aleatorie eșantion simulat printr-o pseudo-variabila aleatoare:
BarChart[BinCounts[RandomReal[{0, 1}, 50000], 0.01]]
În timp ce acest lucru este distribuția veți obține după înmulțirea a două variabile aleatoare:
BarChart[BinCounts[Table[RandomReal[{0, 1}, 50000] *
RandomReal[{0, 1}, 50000], {50000}], 0.01]]
Deci, ambele sunt "random", dar distribuția lor este foarte diferit.
În timp ce *2 Random()** este distribuit uniform:
BarChart[BinCounts[2 * RandomReal[{0, 1}, 50000], 0.01]]
Random() + Random() nu este!
BarChart[BinCounts[Table[RandomReal[{0, 1}, 50000] +
RandomReal[{0, 1}, 50000], {50000}], 0.01]]
La Teorema Limită Centrală prevede că suma de Random() tinde să o distribuție normală în termeni de creștere.
Cu doar patru termeni ai:
BarChart[BinCounts[Table[RandomReal[{0, 1}, 50000] + RandomReal[{0, 1}, 50000] +
Table[RandomReal[{0, 1}, 50000] + RandomReal[{0, 1}, 50000],
{50000}],
0.01]]
Și aici puteți vedea drumul de la o uniformă pentru o distribuție normală, prin adăugarea a 1, 2, 4, 6, 10 și 20 de variabile aleatoare uniform distribuite:
Edit
Câteva credite
Datorită Thomas Ahle pentru evidențierea în comentarii că distribuții de probabilitate arătat în ultimele două imagini sunt cunoscute ca Irwin-Hol distributie
Datorită Heike pentru o minunat rupt[] funcția
Cred că ambele metode sunt la fel de aleatoare deși mea gutfeel ar spune că rand() * rand()
este mai puțin aleatorie, deoarece ar semințe mai multe zerouri. Cât mai curând ca un rand()
este 0
, total devine 0
Nici nu este 'mai aleatoare'.
rand()
generează o previzibile set de numere bazate pe o pseudo-aleatoare de semințe (de obicei în funcție de ora curentă, care este mereu în schimbare). Înmulțirea a două numere consecutive din secventa generează diferite, dar la fel de previzibil, secvență de numere.
Adresându-se dacă acest lucru va reduce coliziunile, răspunsul este nu. Acesta va crește de fapt coliziuni ca urmare a efectului de multiplicare a două numere unde 0 < n < 1
. Rezultatul va fi o mică fracțiune, provocând o prejudecată în rezultatul spre capătul inferior al spectrului.
Unele explicații suplimentare. În cele ce urmează, 'imprevizibil' si 'aleatorie' se referă la capacitatea de cineva să ghicească ce numărul următor va fi bazat pe numerele anterioare, de exemplu. un oracol.
Dat sămânță " x " care generează următoarea listă de valori:
0.3, 0.6, 0.2, 0.4, 0.8, 0.1, 0.7, 0.3, ...
rand()
va genera lista de mai sus, și rand() * rand()
va genera:
0.18, 0.08, 0.08, 0.21, ...
Ambele metode va produce întotdeauna aceeași listă de numere pentru aceeași sămânță, și, prin urmare, sunt la fel de previzibile de un oracol. Dar dacă te uiți la rezultatele pentru înmulțirea a două apeluri, ai'll vedea toate sunt sub 0.3` în ciuda decent de distribuție în secvența originală. Numerele sunt părtinitoare din cauza efectului de înmulțirea a două fracții. Numărul rezultat este întotdeauna mai mică, prin urmare, mult mai probabil să fie o coliziune în ciuda faptului că încă fiind la fel de imprevizibil.
Simplificare pentru a ilustra un punct de vedere.
Să presupunem că funcția aleatorie numai ieșiri 0
sau 1
.
random()
este unul din(0,1)", ci " random()*random()e unul din
(0,0,0,1)`
Puteți vedea în mod clar că șansele de a obține un " 0 " în cel de-al doilea caz sunt egale cu cele de a primi un 1
.
Prima dată când am postat acest raspuns am vrut să-l păstreze cât mai scurt posibil, astfel încât o persoană a citit-o va înțelege dintr-o privire, diferența dintre random () " și " random()*random()
, dar nu pot't mă țină de la a răspunde la original ad litteram întrebare:
Ceea ce este mai mult întâmplare?
Fiind că random()
, random()*random()
, random()+random()
, (random()+1)/2
sau orice altă combinație care nu't conduce la un anumit rezultat, au aceeași sursă de entropie (sau aceeași stare inițială în caz de generatoare pseudoaleatoare), răspunsul ar fi că acestea sunt la fel aleatoare (diferența este în distribuirea lor). Un exemplu perfect ne putem uita la jocul de Zaruri. Numărul pe care îl obține ar fi aleatorie(1,6)+random(1,6) și știm cu toții că obtinerea 7 are cea mai mare șansă, dar asta nu't înseamnă rezultatul a două zaruri de rulare este mai mult sau mai puțin aleatorii decât rezultatul de rulare unul.
Aici's un răspuns simplu. Ia În Considerare Monopol. Dai doi de șase zaruri fețe (sau 2d6 pentru cei dintre voi care prefera jocuri de noroc notație) și să ia suma lor. Cele mai frecvente rezultatul este 7 pentru că există 6 moduri posibile poti rula un 7 (1,6 2,5 3,4 4,3 5,2 și 6,1). Întrucât o 2 poate fi rulat pe 1,1. L's ușor pentru a vedea că de rulare 2d6 este diferită de rulare 1d12, chiar dacă gama este același (ignorând că puteți obține un 1 pe un 1d12, ideea rămâne aceeași). Înmulțirea rezultatele în loc de a le adăuga este de gând să skew-le într-un mod similar, cu cele mai multe dintre rezultatele venind în mijlocul de gama. Daca're încercarea de a reduce aberante, aceasta este o metodă bună, dar nu o't ajuta la a face o distribuție uniformă.
(Și destul de ciudat, va crește scăzut role la fel de bine. Presupunând că dezordine incepe de la 0, ai'll vedea un spike la 0 pentru că se va transforma orice alte rola este într-un 0. Considerăm două numere aleatoare între 0 și 1 (inclusiv) și înmulțirea. Dacă rezultatul este 0, totul devine 0, indiferent de alte rezultate. Singura modalitate de a obține un 1 este pentru ambele role pentru a fi un 1. În practică acest lucru, probabil, ar't contează, dar face pentru un ciudat grafic.)
Te-ar putea ajuta din acest lucru în mai multe numere discrete. Ia în considerare pentru a genera numere aleatoare între 1 și 36, astfel încât să decideți cel mai simplu mod este aruncat doi corect, zaruri cu 6 fețe. Veți obține acest lucru:
1 2 3 4 5 6
-----------------------------
1| 1 2 3 4 5 6
2| 2 4 6 8 10 12
3| 3 6 9 12 15 18
4| 4 8 12 16 20 24
5| 5 10 15 20 25 30
6| 6 12 18 24 30 36
Deci, avem 36 de numere, dar nu toate dintre ele sunt destul de reprezentat, iar unele nu't să apară la toate. Numere apropiere de centrul diagonală (colțul din stânga-jos a colțul din dreapta sus) va apărea cu o frecvență mai mare.
Aceleași principii care descriu distribuția inechitabilă între zaruri se aplică în mod egal pentru numere în virgulă mobilă între 0.0 și 1.0.
Unele lucruri despre "dezordine" sunt contra-intuitive.
Presupunând plat distribuție de rand()
, următorul va primi non-plat distribuții:
sqrt(rand(gama^2))
(rand(gama) + rand(gama))/2
Există o mulțime de alte modalități de a crea specifice părtinire curbe. Am facut un test rapid de rand() * rand()
și devine o distribuție neliniară.
Majoritatea rand() implementari au o anumită perioadă. I. e. după un număr enorm de apeluri secvența se repetă. Secvența de ieșiri de rand() * rand()
repetă în jumătate din timp, așa că este "mai puțin aleatorie", în acest sens.
De asemenea, fără o atentă construcție, efectuarea de aritmetică pe valori aleatoare tinde să provoace mai puțin aleatoriu. Un poster citată mai sus "rand()
+ rand()
+ rand()
..." (k ori, să zicem), care va fi, în fapt, au tendința de a de k ori valoarea medie a intervalului de valori rand()
întoarce. (It's un mers aleator cu măsuri simetrice despre care spui.)
Să presupunem pentru concretețea că rand() returnează un mod uniform distribuite aleator număr real din intervalul [0,1). (Da, acest exemplu permite precizie infinită. Asta nu't schimba rezultatul.) Ai n't alege o anumită limbă și limbi diferite pot face lucruri diferite, dar în urma analizei deține cu modificări pentru orice non-perverse implementarea rand(). Produsul rand() * rand()
este, de asemenea, în intervalul [0,1), dar nu mai uniform distribuite. În fapt, produsul este la fel de probabil să fie în intervalul [0,1/4) ca în intervalul [1/4,1). Mai mult de multiplicare va distorsiona rezultatul chiar mai departe, spre zero. Acest lucru face ca rezultatul să fie și mai previzibil. În linii mari, mai previzibil == mai puțin aleatorii.
Destul de mult orice secvență de operații pe uniform aleatoare de intrare va fi nonuniformly aleatoare, ceea ce duce la creșterea predictibilității. Cu grijă, se poate depăși această proprietate, dar atunci ar fi fost mai ușor pentru a genera o uniform distribuite număr aleator în intervalul de fapt ai vrut, mai degrabă decât a pierde timp cu aritmetica.
"aleatorie" vs "mai aleatorie" este un pic ca și cum cere care Zero este mai zero'y.
În acest caz, rand
este un PRNG, deci nu la întâmplare. (de fapt, destul de previzibil dacă sămânța este cunoscut). Înmulțirea cu o altă valoare este mai mult sau mai puțin aleatorii.
Un adevărat cripto-tip RNG va fi de fapt aleatoare. Și funcționare valori prin orice fel de funcție nu poate adăuga mai mult de entropie la ea, și poate, foarte probabil, elimina entropie, ceea ce face să nu mai aleatoare.
Conceptul're în căutarea pentru "entropia," "grade" de tulburare de un șir de biți. Ideea este simplu de înțeles în ceea ce privește conceptul de "entropiei maxime".
O definiție aproximativă de un șir de biți cu entropia maximă este că nu poate fi exprimată exact în termenii unei mai scurt șir de biți (de exemplu. folosind un algoritm pentru a extinde mai mici șir cu cel original string).
Relevanța maximă a entropiei la dezordine provine din faptul că dacă alegeți un număr "la întâmplare", ai aproape sigur va alege un număr a căror șir de biți este aproape de a avea maxim de entropie, care este, aceasta poate't fi comprimat. Aceasta este cea mai bună înțelegere a ceea ce caracterizează o "aleatorie" număr.
Deci, dacă doriți pentru a face un număr aleator două eșantioane aleatorii care este "ori" ca random, ai'd înlănțui cele două șiruri de biți împreună. Practic, ai'd doar lucrurile probele în înaltă și joasă jumătăți ale unui dublu lungime cuvânt.
Pe o vedere mai practic, dacă veți găsi-te pe cap cu un rahat rand(), se poate uneori ajuta să xor un cuplu de probe împreună --- deși, dacă cu adevărat rupt chiar această procedură a câștigat't de ajutor.
Acceptat răspunsul este destul de minunat, dar nu's un alt mod de a răspunde la întrebarea dumneavoastră. PachydermPuncher's a răspunde are deja această abordare alternativă, și am'm doar de gând să-l extindă un pic.
Cel mai simplu mod de a gândi despre teoria informației este în ceea ce privește cea mai mică unitate de informație, un singur bit.
În biblioteca standard C, rand()
returnează un număr întreg în intervalul de la 0 la RAND_MAX
, o limită care poate fi definită în mod diferit în funcție de platformă. Să presupunem că RAND_MAX se întâmplă să fie definit ca
2^n - 1, unde " n "este un număr întreg (acest lucru se întâmplă să fie cazul în Microsoft's aplicare, unde" n " este de 15). Atunci am putea spune că o bună punere în aplicare ar reveni " n " biți de informație.
Imaginați-vă că rand()
constructe numere aleatoare de flipping o monedă pentru a găsi valoarea de un pic, și apoi repetă până când acesta are un lot de 15 biți. Apoi biții sunt independente (valoarea nici un pic nu influențează probabilitatea de alte bucăți din același lot au o anumită valoare). Deci, fiecare bit considerat independent este ca un număr aleator între 0 și 1 inclusiv, și este "distribuite uniform" peste acest interval (la fel de probabil să fie 0 și 1).
Independența de biți asigură că numerele reprezentate de loturi de biți va fi, de asemenea, distribuite uniform pe toată gama lor. Acest lucru este intuitiv evident: dacă sunt 15 biți, intervalul permis este zero la2^15 - 1
= 32767. Fiecare număr din acel interval este un model unic de biți, cum ar fi:
010110101110010
și dacă biții sunt independente atunci nici un model este mai probabil să apară decât orice alt model. Deci, toate numerele posibile in gama sunt la fel de probabile. Și așa reversul este adevărat: dacă rand()
produce uniform distribuite numere întregi, atunci aceste numere sunt realizate independent de biți.
Deci, cred că de rand()
ca o linie de producție pentru a face biți, care doar se întâmplă să le servească în loturi de mărime arbitrară. Dacă tu nu't, cum ar fi dimensiunea, rupe loturi individual de biți, și apoi le-a pus din nou împreună, în orice cantitate doriți (deși, dacă aveți nevoie de un anumit interval, care nu este o putere a lui 2, aveți nevoie pentru a micsora numere, și, de departe, cel mai simplu mod de a face asta este de a converti în virgulă mobilă).
De a reveni la original sugestie, să presupunem că doriți să mergeți la loturi de 15 loturi de 30 de ani, cere rand () pentru primul număr, pic-tura de 15 locuri, apoi se adaugă un alt rand()
la ea. Asta este un mod de a combina două apeluri la rand ()
, fără a perturba o distribuție uniformă. Acesta funcționează pur și simplu pentru că nu există nici o suprapunere între locațiile unde ai loc biți de informații.
Acest lucru este foarte diferit de a "se întinde" gama de rand()
prin înmulțirea cu o constantă. De exemplu, dacă ai vrut pentru a dubla gama de rand()
ai putea multiplica cu doi - dar acum te - 'd doar numere, și n numere impare! Ca'nu e chiar o buna distribuție și ar putea fi o problemă serioasă în funcție de aplicație, de exemplu, o ruleta joc se presupune că permite ciudat/chiar și pariuri. (De gândire în termeni de biți, ai'd a evita această greșeală intuitiv, pentru că'd dau seama că înmulțirea cu două este aceeași ca și deplasare pe biți la stânga (mai mare importanță) cu un singur loc și umple golul cu zero. Deci, evident, cantitatea de informații este la fel - doar s-a mutat un pic.)
Astfel de lacune în număr variază pot't fi plâns în virgulă mobilă număr de aplicații, pentru că în virgulă mobilă variază în mod inerent au lacune în ele, care pur și simplu nu pot fi reprezentate la toate: o infinit numărul de lipsă numere reale există în decalaj între fiecare două reprezentabile în virgulă mobilă numerele! Deci, trebuie doar să învețe să trăiască cu lacune, oricum.
Ca altii au avertizat, intuiția este riscant în acest domeniu, mai ales că matematicienii pot't reziste ispitei de numere reale, care sunt extrem de confuză lucruri pline de noduros infinituri și aparente paradoxuri.
Dar, cel puțin, dacă tu crezi că termenii de biți, intuitia ta s-ar putea obține un pic mai departe. Biți sunt foarte ușor - chiar calculatoare le pot înțelege.
Cum au spus și alții, ușor răspunsul scurt este: Nu, nu este întâmplătoare, dar aceasta nu schimba distribuția. Să presupunem că ai jucat un joc de zaruri. Ai ceva complet corecte, zaruri aleatoare. Ar muri rulouri fi "mai aleatorie" dacă înainte de fiecare rola mor, ai pus prima data două zaruri într-un castron, se scutură în apropiere, a luat unul dintre zaruri la întâmplare, și apoi laminate asta? În mod clar nu ar fi nicio diferență. Dacă ambele zaruri dau numere aleatoare, atunci alege la întâmplare unul dintre cele două zaruri va face nici o diferență. Oricum ai'll obține un număr aleator între 1 și 6, cu o distribuție de peste un număr suficient de mare de role. Cred că în viața reală, o astfel de procedură ar putea fi util dacă sunteți suspectat că zarurile NU ar fi corect. Dacă, să zicem, zarurile sunt ușor dezechilibrat deci, una tinde să dea 1 mai des decât 1/6 din timp, și încă tinde să dea 6 neobișnuit de multe ori, atunci alege aleatoriu între cele două tind să ascundă părtinire. (Deși, în acest caz, 1 și 6 ar veni mai mult de 2, 3, 4, și 5. Ei bine, cred că în funcție de natura dezechilibrului.) Există multe definiții de dezordine. O definiție de o serie aleatoare este că aceasta este o serie de numere de produs printr-un proces aleator. Prin această definiție, dacă dau un târg mor de 5 ori și a obține numere 2, 4, 3, 2, 5, aceasta este o serie aleatoare. Dacă am rostogoli în aceeași corect mor de 5 ori mai mult și a obține 1, 1, 1, 1, 1, atunci care este, de asemenea, o serie aleatoare. Mai multe afișe au subliniat faptul că funcții aleatoare pe un calculator nu sunt cu adevărat aleatoriu, ci mai degrabă pseudo-aleatoare, și că, dacă știi algoritmul și semințele sunt complet previzibile. Acest lucru este adevărat, dar cele mai multe ori complet irelevant. Dacă am shuffle un pachet de cărți și apoi să le predea la un moment dat, acest lucru ar trebui să fie o serie aleatoare. Dacă cineva trage cu ochiul la cărțile, rezultatul va fi complet previzibil, dar de cele mai multe definiții de dezordine acest lucru nu va face mai puțin aleatorii. Dacă seria trece testele statistice de dezordine, faptul că am tras cu ochiul la cărțile nu se va schimba acest fapt. În practică, dacă suntem de jocuri de noroc sume mari de bani pe capacitatea dumneavoastră de a ghici următoarea carte, apoi, faptul că te-ai uitat la cărți este extrem de relevant. Dacă suntem folosind serie pentru a simula meniul alege de vizitatori la site-ul nostru web, în scopul de a testa performanța de sistem, atunci faptul că te-ai uitat va face nici o diferență, la toate. (Atâta timp cât nu-i modificați programul pentru a profita de această cunoaștere.) EDIT Eu nu't cred că aș putea să-mi răspuns la Monty Hall problema într-un comentariu, așa că am'll actualizare răspunsul meu. Pentru cei care nu't citit Belisarius link-ul, esența este: Un spectacol de joc concurent este dat o alegere de 3 usi. Spatele este un premiu valoros, în spatele altora ceva lipsit de valoare. El alege ușa #1. Înainte de a dezvălui dacă este un învingător sau un ratat, gazdă deschide ușa #3 pentru a descoperi că este un ratat. Apoi, el îi dă concurent posibilitatea de a comuta la ușă #2. Ar trebui să concurentul a face acest lucru sau nu? Răspunsul, care deranjează mulți oameni's intuiție, este că el ar trebui să treacă. Probabilitatea ca sa originală alege fost câștigătorul este de 1/3, că cealaltă ușă este câștigătorul este de 2/3. Mea inițială intuiție, împreună cu multe alte persoane, este că nu ar fi nici un câștig în comutare, care cotele au fost schimbate la 50:50. După toate, să presupunem că cineva a trecut pe TV doar după ce gazda a deschis pierde ușă. Acea persoană ar vedea două rămase ușilor închise. Presupunând că el știe natura jocului, el ar spune că există o 1/2 șansă de fiecare ușă ascunde premiul. Cum pot șansele pentru privitorul fi 1/2 : 1/2 în timp ce cotele pentru concurent sunt 1/3 : 2/3 ? Am avut într-adevăr să se gândească la acest lucru pentru a bate intuiția mea în formă. Pentru a obține un mâner pe ea, să înțeleagă că atunci când vorbim despre probabilități într-o problemă ca aceasta, ne referim, probabilitatea de a atribui având în vedere informațiile disponibile. De la un membru al echipajului care a pus premiu pe urmă, să zicem, ușa #1, probabilitatea ca premiul este în spatele ușii #1 este de 100%, iar probabilitatea ca acesta este în spatele a două uși este zero. Membrul echipajului's șansele sunt diferite decât concurentul's șansele pentru că el știe ceva ce concurenta nu't, și anume, o ușă care a pus premiul spatele. De asemenea, contestent's șansele sunt diferite decât viewer's șansele pentru că el știe ceva care privitorul nu't, și anume, o ușă care inițial le-a luat. Acest lucru nu este irelevant, pentru că gazda's alegere de care să se deschidă ușa nu este întâmplătoare. El nu va deschide ușa concurentul a ales, și el nu va deschide ușa care ascunde premiul. Dacă acestea sunt pe aceeași ușă, care-l lasă două opțiuni. Dacă acestea sunt diferite uși, care lasă doar unul. Deci, cum putem veni cu 1/3 și 2/3 ? Atunci când concurentul inițial luat-o ușă, el a avut o șansă de 1/3 de a alege câștigătorul. Cred că este evident. Asta înseamnă că acolo a fost un 2/3 șanse ca una dintre celelalte usi este câștigătorul. Dacă gazda joc l-posibilitatea de a comuta fără a da orice informații suplimentare, nu ar fi nici un câștig. Din nou, acest lucru ar trebui să fie evident. Dar un mod de a privi lucrurile este de a spune că există o 2/3 șanse ca el ar câștiga de comutare. Dar el are 2 alternative. Deci fiecare are doar 2/3 împărțit la 2 = 1/3 șanse de a fi câștigătorul, care nu este mai bun decât al lui original alege. Desigur, știam deja rezultatul final, asta calculează în mod diferit. Dar acum gazda dezvăluie că una dintre aceste două opțiuni nu este câștigător. Deci de 2/3 șanse ca o ușă a n't alege câștigătorul, el știe acum că 1 din 2 alternative e't acesta. Celelalte s-ar putea sau nu ar putea fi. Deci el nu mai are 2/3 dividied de 2. El are zero pentru a deschide ușa și 2/3 pentru ușă închisă.
Te Consider un simplu banul problemă în cazul în care chiar este considerat capete și ciudat este considerat cozi. Implementarea logică este:
rand() mod 2
Peste o suficient de mare de distribuție, numărul de numere ar trebui să fie egal cu numărul de numere impare.
Acum ia în considerare o ușoară tweak:
rand() * rand() mod 2
Dacă unul dintre rezultate este chiar, atunci întregul rezultat ar trebui să fie chiar. Ia în considerare 4 rezultate posibile (chiar chiar = chiar, chiar impar = par, impar chiar = chiar, ciudat impar = impar). Acum, peste o suficient de mare de distribuție, răspunsul ar trebui să fie chiar și 75% din timp.
Am'd cap. dacă aș fi.
Acest comentariu este într-adevăr mai mult de o explicație de ce nu ar trebui't pună în aplicare un custom funcție aleatoare bazat pe metoda ta decât o discuție cu privire la proprietăți matematice de dezordine.
Atunci când în dubiu despre ce se va întâmpla cu combinații de numere aleatoare, puteți folosi lecțiile învățate în teoria statistică.
În OP's situației vrea să știe ce's rezultatul a X*X = X^2, unde X este o variabilă aleatoare Uniform distribuite de-a lungul[0,1]. Am'll folosi CDF tehnica de l's doar un unu-la-unu de cartografiere.
Deoarece X ~ Uniform[0,1] it's cdf este: fX(x) = 1 Vrem transformarea Y <- X^2 astfel y = x^2 Găsi inversul x(y): sqrt(y) = x acest lucru ne dă x în funcție de y. Apoi, a găsi derivat dx/dy: d/dy (sqrt(y)) = 1/(2 sqrt(y))
Distribuția Y este dat ca: fY(y) = fX(x(y)) |dx/dy| = 1/(2 sqrt(y))
Am're nu a terminat încă, trebuie să ne domeniu de Y. deoarece 0 <= x < 1, 0 <= x^2 < 1 deci Y este în intervalul [0, 1). Dacă vrei să verifici dacă pdf-ul de Y este într-adevăr un pdf, integra de-a lungul domeniu: [Integreze 1/(2 sqrt(y)) 0-1][1] și într-adevăr, ea apare ca 1. De asemenea, observați forma de spus funcție se pare că ceea ce belisarious postat.
Ca pentru lucruri cum ar fi X1 + X2 + ... + Xn, (unde Xnu ~ Uniformă pe[0,1]) putem apela la Teorema Limită Centrală, care funcționează pentru orice distribuție a căror momente exista. Acesta este motivul pentru care Z-test există de fapt.
Alte tehnici de determinare a rezultat pdf includ Jacobian transformare (care este o versiune generalizată a cdf tehnică) și MGF tehnica.
[1]: http://www.wolframalpha.com/input/?i=integrate+1/(2+sqrt(y))+de la+0+pentru+1
EDIT: Ca o precizare, nu act de faptul că m-am'm a vorbi despre distribution de transformare rezultată și nu randomness. Ca's, de fapt, pentru o discuție separată. De asemenea, ce am, de fapt, rezultatul a fost de (rand())^2. Pentru rand() * rand() l's mult mai complicate, care, în nici un caz't duce la o distribuție uniformă de orice natură.
L's nu prea evident, dar rand()
este de obicei mult mai aleatoriu decât rand()*rand()
. Ce's important este că această e't de fapt foarte important pentru cele mai multe utilizări.
Dar, în primul rând, ele produc diferite distribuții. Aceasta nu este o problemă dacă asta este ceea ce vrei, dar nu contează. Dacă aveți nevoie de o anumită distribuție, atunci ignora tot "ceea ce este mai mult întâmplătoare" întrebare. Deci, de ce este rand()
mai mult la întâmplare?
Nucleul de ce rand()
este mai aleator (în ipoteza că se produce plutitoare-punct de numere aleatoare cu intervalul [0..1], ceea ce este foarte frecvent) este că, atunci când vă înmulțiți două FP numere împreună cu o mulțime de informații în mantisă, veți obține unele pierderi de informații de pe urmă; nu'doar ca nu-s destul de puțin într-o IEEE dublă precizie float să dețină toate informațiile care au fost în două IEEE dublă precizie plutește uniform selectate aleatoriu din [0..1], și cele suplimentare de biți de informație sunt pierdut. Desigur, aceasta nu't contează atât de mult de când ai (probabil) nu't de gând să utilizeze aceste informații, dar pierderea este reală. De asemenea, nu't într-adevăr chestiune care tine de distribuție produce (de exemplu, operațiune care le utilizați pentru a face combinații). Fiecare dintre aceste numere aleatoare a (cel mai bun) 52 biți de informații aleatorii – ca's cât de mult o IEEE dublă poate ține și dacă se combină două sau mai multe într-o singură, ai're încă limitată de a avea cel mult 52 de biți de informații aleatorii.
Cele mai multe utilizări de numere aleatoare don't folosi nici pe aproape la fel de mult intamplarea ca este de fapt disponibil în aleatoare sursa. Obține o bună PRNG și don't vă faceți griji prea mult despre asta. (Nivelul de "bunătatea" depinde de ceea ce ai're face cu ea; trebuie să fii atent atunci când faci simulare Monte Carlo sau criptografie, dar altfel nu se poate folosi, probabil, standard PRNG ca's, de obicei, mult mai rapid.)
Înmulțirea numerelor va sfârși într-o mai mică soluție variază în funcție de arhitectura calculatorului.
Dacă ecranul computerului prezinta 16 cifre rand()
ar fi spus 0.1234567890123
înmulțită cu un al doilea rand()`, 0.1234567890123, ar da 0.0152415 ceva
te'd gasi cu siguranta mai puține soluții dacă'd a repeta experimentul de 10^14 ori.
Plutitoare randoms se bazează, în general, pe un algoritm care produce un număr întreg între zero și o anumită gamă. Ca atare, prin utilizarea rand()rand(), vă sunt, în esență, spun int_rand()int_rand()/rand_max^2 - ceea ce înseamnă că sunt excluzând orice număr prim / rand_max^2.
Care schimbă randomizat de distribuție în mod semnificativ.
rand() este distribuit uniform pe cele mai multe sisteme, și dificil de a prezice dacă sunt corect instalate. Folosi asta daca nu ai un motiv special pentru a face matematica pe ea (de exemplu, modelarea distribuției la o nevoie de curba).
Cele mai multe dintre aceste distribuții întâmpla pentru că aveți pentru a limita sau de a normaliza de numere aleatorii.
Vom normaliza să fie toate pozitive, se încadrează într-o gamă largă, și chiar să se încadreze în limitele impuse de dimensiunea memoriei pentru atribuit tip de variabilă.
Cu alte cuvinte, pentru că avem de a limita apelul aleatoriu între 0 și X (X fiind limita de dimensiune variabilă noastre) vom avea un grup de "aleatorie" numere între 0 și X.
Acum când adăugați numere aleatorii la un alt număr aleator suma va fi undeva între 0 și 2X...asta denatureaza valorile departe de marginea puncte (probabilitatea de adăugarea a două numere mici împreună și două numere împreună este foarte mic atunci când aveți două numere aleatoare pe o gamă largă).
Cred că de cazul în care ați avut un număr care este aproape de zero și adăugați-l cu un alt număr aleator se va obține cu siguranță mai mare și departe de 0 (acest lucru va fi valabil de un număr mare, precum și este puțin probabil să aibă două numere mari (numere de aproape de X) returnat de funcția Aleatorie de două ori.
Acum dacă ai fost la setup metoda aleatorie cu numere negative și pozitive numere (se întinde în mod egal pe axa zero) acest lucru nu va mai fi cazul.
Spune, de exemplu, RandomReal ({x, x}, 50000, .01)
, atunci v-ar obține o distribuție uniformă a numerele de pe negativ o parte pozitivă și dacă ar fi să adăugați numere aleatoare împreună, ei își vor păstra "dezordine".
Acum am'm nu sunt sigur ce se va întâmpla cu Random() * Random()
cu negativ la pozitiv span...ar fi interesant un grafic pentru a vedea...dar eu trebuie să mă întorc la scris cod acum. :-P
Nu există nici un astfel de lucru ca mai mult aleatoare. Acesta este fie aleatoare sau nu. Aleatoare înseamnă "greu de prezis". Aceasta nu înseamnă non-deterministe. Ambele aleatoare() și aleatoare() * random() sunt la fel de aleatoare dacă aleatoare() este aleatoare. Distribuția este lipsită de relevanță în măsura în dezordine merge. Dacă o distribuție neuniformă apare, înseamnă doar că unele valori sunt mai susceptibile decât altele; ele sunt încă imprevizibile.
Din pseudo-aleatoriu este implicat, numerele sunt foarte mult determinist. Cu toate acestea, pseudo-aleatoriu este de multe ori suficient în probabilitatea de modele și simulări. Este destul de bine cunoscut faptul că a face o pseudo-random number generator de complicat numai că este dificil de a analiza. Este puțin probabil să îmbunătățească dezordine; de multe ori provoacă-l să eșueze teste statistice.
Proprietățile dorite de numere aleatoare sunt importante: repetabilitate și reproductibilitate, statistic aleatoriu, (de obicei) uniform distribuite, și o perioadă de mare, sunt câteva.
Privind transformările pe numere aleatoare: Cum a spus cineva, suma a două sau mai uniform distribuite rezultatele într-o distribuție normală. Acest lucru este aditivi teorema limită centrală. Aceasta se aplică indiferent de sursa distribuție, atâta timp cât toate distribuțiile sunt independente și identic. La multiplicativ teorema limită centrală spune că produsul a două sau mai independent și indentically distribuite variabile aleatoare este filgrastim. Graficul altcineva a creat se pare exponențială, dar este într-adevăr filgrastim. Deci random() random() este lognormally distribuite (deși aceasta nu poate fi independent de numere sunt trase din același flux). Acest lucru poate fi de dorit în unele aplicații. Cu toate acestea, de obicei este mai bine pentru a genera un număr aleator și transformarea acesteia într-o lognormally-distribuit număr. Random() random() poate fi dificil de a analiza.
Pentru mai multe informații, consultați cartea mea la www.performorama.org. Cartea este în construcție, dar materialul în cauză este acolo. Rețineți că capitolul și secțiunea numerele se pot schimba de-a lungul timpului. Capitolul 8 (teoria probabilităților) - secțiuni 8.3.1 și 8.3.3, capitolul 10 (numere aleatorii).