generator liczb losowych
Widzisz wersję archiwalną tematu "generator liczb losowych" z forum pl.comp.programming
Urlyk - 11 Lip 2005, 07:53
Hej,
Czy ktoś ma pomysł na algorytm generujący:
r (r3) losowych liczb rzeczywistych (double) których suma zawsze wynosi 0. Oczywiście wszystkie liczby muszą być w pełni losowe (niezależne).
Program piszę w Javie, ale wystarczy cokolwiek: dowolny język, pseudokod, idea, źródła w których mogę poszukać...
Dzięki, Urlyk
Stachu 'Dozzie' K. - 11 Lip 2005, 07:55
Czy ktoś ma pomysł na algorytm generujący: r (r3) losowych liczb rzeczywistych (double) których suma zawsze wynosi 0. Oczywiście wszystkie liczby muszą być w pełni losowe (niezależne).
Program piszę w Javie, ale wystarczy cokolwiek: dowolny język, pseudokod, idea, źródła w których mogę poszukać...
Na ile jeszcze grup wyślesz tego posta? PLONK.
Adam Drzewiecki - 11 Lip 2005, 08:02
r (r3) losowych liczb rzeczywistych (double) których suma zawsze wynosi 0. Oczywiście wszystkie liczby muszą być w pełni losowe (niezależne).
Z tego, że suma tych liczb ma wynosić 0, wynika, że nigdy nie będą one od siebie niezależne. To jest wzajemnie sprzeczne. Warunek na sumowanie jest związkiem pomiędzy liczbami.
JanK - 11 Lip 2005, 10:14
Oczywiście wszystkie liczby muszą być w pełni losowe (niezależne).
nie ma czegoś takiego jak liczby w pełni losowe, są jedynie pseudolosowe. Dlaczego? bo wszystkie generatory liczb są mniej lub bardziej pseudolosowe.
agrrr, ale mi się filozof włączył...
Pozdr
Mikstur - 11 Lip 2005, 18:18
Hej, Czy ktoś ma pomysł na algorytm generujący:
r (r3) losowych liczb rzeczywistych (double) których suma zawsze wynosi 0. Oczywiście wszystkie liczby muszą być w pełni losowe (niezależne).
Pytasz o algorytm a nie o kodowanie, zatem....
1) Losowosc zwykle nie jest pelna. Przewaznie jest to deterministyczna sekwencja liczb udajaca ciag losowy. kiedys slyszalem o tym, zeby uzywac temp CPU jako generatora losowosci ale nie wiem czy sie udalo. 2) "pelna losowosc" i "niezaleznosc" to osobne sprawy. 3) w matematyce mowi sie "zmienna losowa" a nie "liczba losowa".
Wezmy dla uproszczenia r=2. Zmienna losowa to funkcja przyjmujaca losowe wartosci. Niech X i Y beda zmiennymi losowymi. P(X=a) oznacza prawdopodobienstwo tego, ze X przyjmie wartosc a. Mozemy sie ograniczyc do liczb naturalnych bo *double* to i tak skonczona sekwencja bitow. Losujac takim randem() ograniczamy sie do rozkladow dyskretnych, tzn: P(X=i) jest dane dla i=1,2...N i wszystkie pstwa sumuja sie do jedynki, tzn P(X=1) + P(X=2) +... P(X=N) = 1. Zmienna Y moze miec inny rozklad niz X, tzn P(X=a) moze byc rozne od P(Y=a). X i Y sa niezalezne gdy P(X=a, Y=b) = P(X=a)*P(Y=b). Tyle teorii. Teraz przyklad (miedzy oczy chyba).
Wezmy X i Y przyjmujace wartosci od -N do N. Niech X i Y beda niezalezne i niech zawsze sumuja sie do jedynki. Tak jak chciales. Zatem:
(A) P(X=a, Y=b) = P(X=a)*P(Y=b) bo niezalezne, (B) P(X+Y=0)=1 bo suma, zatem P(X = -Y)=1
Wezmy przykladowo P(X=a) = e, P(Y=-a) = f. Musi byc e,f < 1 bo gdyby jeden z nich byl rowny 1 to mielibysmy bardzo nieciekawa zmienna losowa. Stad:
1 = P(X=a, Y=-a) = e * f < 1.
Jestem kiepas (i to po polnocy), moze sie rabnalem. Zagladaja tu bystrzejsi ludzie, jakby co to mnie poprawia. Jak na razie to dla r=2 zadanie nie ma sensu. Dla r3 powinno byc podobnie bo definicja niezaleznosci jest analogiczna.
Marcin 'Qrczak' Kowalczyk - 11 Lip 2005, 18:57
Pytasz o algorytm a nie o kodowanie, zatem.... 1) Losowosc zwykle nie jest pelna. Przewaznie jest to deterministyczna sekwencja liczb udajaca ciag losowy. kiedys slyszalem o tym, zeby uzywac temp CPU jako generatora losowosci ale nie wiem czy sie udalo.
Tego rodzaju pytania o algorytm mogą być sensowne w ścisłym sensie: zakładamy, że mamy do dyspozycji generator z rozkładem jednostajnym na przedziale liczb naturalnych albo rzeczywistych, i wyliczamy coś innego na jego podstawie.
Sc0rpi0 - 11 Lip 2005, 19:13
Urlyk uderzył(a) głową w klawiaturę i wyszło takie coś:
Czy ktoś ma pomysł na algorytm generujący: r (r3) losowych liczb rzeczywistych (double) których suma zawsze wynosi 0. Oczywiście wszystkie liczby muszą być w pełni losowe (niezależne).
Nie, bo to jest algorytm nieistniejący. Może być jedno z dwojga: 1. losujesz r liczb sprawdzając tylko czy r3 i suma=0, ale nie zakładasz maksymalnego r i wtedy masz marne gwarancje, że program zakończy się w rozsądnym czasie.
2. zakładasz jakies r, losujesz r-1 liczb, a ostatnia ewidentnie losowa nie będzie, bo być nie może - musi być taka żeby suma była zerowa.
Albo rybki albo akwarium.
Zbyszek Malec - 11 Lip 2005, 19:13
Sc0rpi0 samobazgroły:
2. zakładasz jakies r, losujesz r-1 liczb, a ostatnia ewidentnie losowa nie będzie, bo być nie może - musi być taka żeby suma była zerowa.
Ciekawe rozwiązanie tego problemu podał Piotr Lipson na pl.comp.lang.java, mam nadzieję że sie nie obrazi za przeklejenie
"Możesz zrobic tak, ze wylosowujesz r liczb, liczysz ich sumę, a następnie "poprawiasz" na podstawie sumy każdą z wylosowanych liczb tak zeby poprawiona suma wynosiła zero, musisz zwrocic baczna uwage na stabilność numeryczną takiego algorytmu."
Sc0rpi0 - 11 Lip 2005, 19:58
Zbyszek Malec uderzył(a) głową w klawiaturę i wyszło takie coś:
| 2. zakładasz jakies r, losujesz r-1 liczb, a ostatnia ewidentnie losowa | nie będzie, bo być nie może - musi być taka żeby suma była zerowa. Ciekawe rozwiązanie tego problemu podał Piotr Lipson na pl.comp.lang.java, mam nadzieję że sie nie obrazi za przeklejenie
"Możesz zrobic tak, ze wylosowujesz r liczb, liczysz ich sumę, a następnie "poprawiasz" na podstawie sumy każdą z wylosowanych liczb tak zeby poprawiona suma wynosiła zero, musisz zwrocic baczna uwage na stabilność numeryczną takiego algorytmu."
Tia, ale wtedy nie jedna, a wszystkie nie są losowe, mogą się tylko takie wydawać ;) (nawet jeżeli każdą poprawiasz "w kierunku" zniwelowania sumy o 0.000000000000001).
Marcin 'Qrczak' Kowalczyk - 12 Lip 2005, 03:29
| "Możesz zrobic tak, ze wylosowujesz r liczb, liczysz ich sumę, a | następnie "poprawiasz" na podstawie sumy każdą z wylosowanych liczb tak | zeby poprawiona suma wynosiła zero, musisz zwrocic baczna uwage na | stabilność numeryczną takiego algorytmu." Tia, ale wtedy nie jedna, a wszystkie nie są losowe,
Są. Jest lepiej niż z wyliczeniem ostatniej, bo każda liczba ma taki sam rozkład. Jeśli wyliczamy tylko ostatnią, to ta ostatnia ma większą wariancję niż pozostałe (chyba że liczby są tylko dwie).
Jedrzej Dudkiewicz - 12 Lip 2005, 03:39
"Możesz zrobic tak, ze wylosowujesz r liczb, liczysz ich sumę, a następnie "poprawiasz" na podstawie sumy każdą z wylosowanych liczb tak zeby poprawiona suma wynosiła zero, musisz zwrocic baczna uwage na stabilność numeryczną takiego algorytmu."
A było powiedziane, jak ma wyglądać "poprawianie"?
JD
man - 12 Lip 2005, 08:11
| "Możesz zrobic tak, ze wylosowujesz r liczb, liczysz ich sumę, a | następnie "poprawiasz" na podstawie sumy każdą z wylosowanych liczb tak | zeby poprawiona suma wynosiła zero, musisz zwrocic baczna uwage na | stabilność numeryczną takiego algorytmu." A było powiedziane, jak ma wyglądać "poprawianie"?
JD
Moze po prostu sumujesz te n liczb a nastepnie dzielisz przez ich ilosc i od kazdej odejmujesz powstala liczbe [tj. wartosc(n)/n ].
Sebastian Nibisz przedstawil to tak na pl.comp.lang.c. Ale takie rozwiazanie wiaze sie z innymi problemami...
pozdro man
Mariusz Kruk - 12 Lip 2005, 09:57
JanK pozwoliła sobie popełnić co następuje:
| Oczywiście wszystkie liczby muszą być w pełni losowe (niezależne). nie ma czegoś takiego jak liczby w pełni losowe, są jedynie pseudolosowe. Dlaczego? bo wszystkie generatory liczb są mniej lub bardziej pseudolosowe.
A założymy się? :-P
radarek - 12 Lip 2005, 10:13
Hej, Czy ktoś ma pomysł na algorytm generujący:
r (r3) losowych liczb rzeczywistych (double) których suma zawsze wynosi 0. Oczywiście wszystkie liczby muszą być w pełni losowe (niezależne).
Moze taki pomysl (dla r parzystych): Mamy r liczb, wiec ich max suma r*max_double Losujemy liczbe z zakresu min_double, max_double co okresla "przeciecie" - losujemy przeciecia r/2 razy zeby otrzymac r "kawalkow", ktore sa poszukiwanymi liczbami. Trzeba by je potem wyznaczyc i chyba bez sortowania sie nie obejdzie. Ile max oczekujesz r? Jesli duze to mozna dla nieparzystych ostatnia liczbe dorzucic 0 i nic wielkiego sie nie stanie :D
Mikstur - 12 Lip 2005, 12:47
| "Możesz zrobic tak, ze wylosowujesz r liczb, liczysz ich sumę, a | następnie "poprawiasz" na podstawie sumy każdą z wylosowanych liczb tak | zeby poprawiona suma wynosiła zero, musisz zwrocic baczna uwage na | stabilność numeryczną takiego algorytmu."
| Tia, ale wtedy nie jedna, a wszystkie nie są losowe,
Są. Jest lepiej niż z wyliczeniem ostatniej, bo każda liczba ma taki sam rozkład. Jeśli wyliczamy tylko ostatnią, to ta ostatnia ma większą wariancję niż pozostałe (chyba że liczby są tylko dwie).
Pewnie, ze sa. Wariancja jest chyba r-1 razy wieksza ale czy warto szlifowac algorytm? Wedlug mnie jest to jakis malutki progzal (bardziej cwiczenie na petle for...). Choc to zawsze dobry pretekst zeby sobie pogadac :)
Mikstur - 12 Lip 2005, 13:06
| Pytasz o algorytm a nie o kodowanie, zatem....
| 1) Losowosc zwykle nie jest pelna. Przewaznie jest to | deterministyczna sekwencja liczb udajaca ciag losowy. kiedys | slyszalem o tym, zeby uzywac temp CPU jako generatora losowosci | ale nie wiem czy sie udalo.
Tego rodzaju pytania o algorytm mogą być sensowne w ścisłym sensie: zakładamy, że mamy do dyspozycji generator z rozkładem jednostajnym na przedziale liczb naturalnych albo rzeczywistych, i wyliczamy coś innego na jego podstawie.
Jasne. Chcialem tylko zwrocic uwage na precyzje wypowiedzi. Algorytm to opis dzialan krok po kroku. Koder majac algorytm, jesli jest dobrym koderem, zrobi wszystko jak trzeba. Teoretycznie moze zakodowac cuda nie wiedzac do konca co klepie. Natomiast czlowiek projektujacy algorytm musi znac strone teoretyczna zagadnienia. Tutaj zabieramy sie do projektowania algorytmu probalistycznego a na dzien dobry sa "kwiatki" typu losowosc = niezaleznosc.
Sc0rpi0 - 13 Lip 2005, 00:06
Mikstur uderzył(a) głową w klawiaturę i wyszło takie coś:
| "Możesz zrobic tak, ze wylosowujesz r liczb, liczysz ich sumę, a | następnie "poprawiasz" na podstawie sumy każdą z wylosowanych liczb tak | zeby poprawiona suma wynosiła zero, musisz zwrocic baczna uwage na | stabilność numeryczną takiego algorytmu." | Tia, ale wtedy nie jedna, a wszystkie nie są losowe,
| Są.
Nie są. Jakby były losowe nie musiałbyś ingerowac i poprawiać ;P
| Jest lepiej niż z wyliczeniem ostatniej, bo każda liczba ma taki | sam rozkład.
Tia ? A mnie się wydaje, że prawdopodobieństwo wystąpienia liczb skrajnych jest mniejsze (tia, nawet double ma górny i dolny limit). Jeżeli suma będzie != 0 i "poprawiamy" wszystkie tak aby się wyzerowała to co się dzieje z liczbami na skraju zakresów ?
Pewnie, ze sa. Wariancja jest chyba r-1 razy wieksza ale czy warto szlifowac algorytm? Wedlug mnie jest to jakis malutki progzal (bardziej cwiczenie na petle for...). Choc to zawsze dobry pretekst zeby sobie pogadac :)
A ja to widzę tak, że jak ostatnią dopasowujemy do reszty (losowej) i ją wymieszam z tą resztą to niech mi ktoś wskaże która była dopasowywana ;P
Marcin 'Qrczak' Kowalczyk - 13 Lip 2005, 04:29
| Jest lepiej niż z wyliczeniem ostatniej, bo każda liczba ma taki | sam rozkład. Tia ? A mnie się wydaje, że prawdopodobieństwo wystąpienia liczb skrajnych jest mniejsze (tia, nawet double ma górny i dolny limit).
Chodzi o to, że każda z losowanych liczb ma taki sam rozkład, a nie, że ten rozkład jest jednostajny (bo - jak zauważasz - nie jest).
A ja to widzę tak, że jak ostatnią dopasowujemy do reszty (losowej) i ją wymieszam z tą resztą to niech mi ktoś wskaże która była dopasowywana ;P
I tak będzie krzywo. Wyniki z pojedynczą liczbą wybijającą się w górę albo w dół będą bardziej prawdopodobne niż wyniki bardziej wyrównane. Dwie liczby nigdy nie wybiją się tak daleko jak jedna, nawet jeśli suma byłaby odpowiednia.
Pokazałeś, że taki sam rozkład każdej z liczb to jeszcze nie wszystko.
Sc0rpi0 - 13 Lip 2005, 18:20
Marcin 'Qrczak' Kowalczyk uderzył(a) głową w klawiaturę i wyszło takie coś:
I tak będzie krzywo. Wyniki z pojedynczą liczbą wybijającą się w górę albo w dół będą bardziej prawdopodobne niż wyniki bardziej wyrównane. Dwie liczby nigdy nie wybiją się tak daleko jak jedna, nawet jeśli suma byłaby odpowiednia.
Okidoki dr Jones :), ale jesio jeden problemik pozostaje i to przy obydwu metodach. Co w przypadku jak sobie wylosuję liczby których suma przekracza zakres ;) ? Czy losujemy z doubla czy z zakresu jakiegos tak czy siak możemy przekroczyć. Jak losujemy z pełnego zakresu double to problem się sam rozwiązuje bo nie policzymy sumy poprawnie. Ale z zakresu to może byc np. tak: 4 liczby z <-100,100: -100,11,90,100, suma ma być 0. Po pierwsze suma 101, po 2 jak będziemy korygować wsio w którąkolwiek stronę to nam liczby zaczną "wyjeżdzać" poza zakres. Może skalowanie jakieś by tu pomogło ?
Marcin 'Qrczak' Kowalczyk - 13 Lip 2005, 19:16
Co w przypadku jak sobie wylosuję liczby których suma przekracza zakres ;) ?
Zakres czego?
Zadanie nie było dokładnie sformułowane. Nie było powiedziane, jaki ma być rozkład tych liczb; w szczególności czy mają się mieścić w jakimś konkretnym przedziale i jakiego rzędu wielkości powinny mniej więcej być. Wszystko zależy od wymagań zadania.
90% znizki na nowe narzedzie do generacji aplikacji internetowych .NET, ASP, PHP, Java, CFML - CodeCharge Studio
Problem matematyczny - najwiekszy wspolny podzielnik dwoch liczb !?
(Asm) Pomocy: mnozenie liczb wielokrotnej precyzji
Problem (?) z teorii liczb/arytmetyki komp.
marcowiatka 2009 i mamusie 1080
74 ile to miesiEAcy
komputery gry amiga
starych domow
patrol 3 4 lipca
agencja nieruchomoB6ci Grodzisk mazowiecki
forum scorpio
prosba o napisanie programu w c
czeslaw niemen 2222dziwny jest ten swiat2222 text
Katalog wypowiedzi z for internetowych ^^ Strona Główna
|
|