[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

pl.comp.programming

Inicjalizowanie generatora liczb pseudolosowych

adj

12/4/2006 11:48:00 AM

Witam,

Przez dosc dlugi czas wydawalo mi sie ze inicjalizowanie generatora liczb
pseudolosowych za pomoca wartosci zwracanej przez wywolanie funkcji time, jest w
miare dobrym pomyslem. Teraz jednak pisze program, w ktorym losowosc ma dosc
istotne znaczenie.

Natknalem sie w dokumentacji biblioteki boost (
http://www.boost.org/libs/random/rando... ) na nastepujace stwierdzenie:
[cite]
Caveat: std::time(0) is not a very good truly-random seed. When called in rapid
succession, it could return the same values, and thus the same random number
sequences could ensue.
[/cite]
Poszukalem w ksiazkach i jedyne co znalazlem to w ksiazce "Komputerowe
generatory liczb losowych" Wieczorkowskiego i Zielinskiego propozycje, aby
generatory inicjowac przy pomocy wartosci
1) r+100(m-1+12(d-1+31(g+24(min+60s))))
lub
2) s+60(min+60(g+24(d-1+31(m-1+12r))))
Gdyby przypadkiem liczby te byly parzyste dodac jeszcze do nich 1. (m - miesiac
od 1 do 12, g - godzina od 0 do 23, min - minuta od 0 do 59, s - sekunda od 0 do
59, r - ostatnie dwie cyfry roku)

W necie natomiast nie znalazlem nic konkretnego.

Moze ktos z Grupowiczow mial problem podobny do mojego i zna jakies jego "jak
nabardziej losowe rozwiazanie" :)

pozdrawiam
adj

--
Wys3ano z serwisu OnetNiusy: http://niu...
50 Answers

Stachu 'Dozzie' K.

12/4/2006 11:55:00 AM

0

On 04.12.2006, adj <a_d_jWYTNIJTO@poczta.onet.pl> wrote:
> Witam,
>
> Przez dosc dlugi czas wydawalo mi sie ze inicjalizowanie generatora liczb
> pseudolosowych za pomoca wartosci zwracanej przez wywolanie funkcji time, jest w
> miare dobrym pomyslem. Teraz jednak pisze program, w ktorym losowosc ma dosc
> istotne znaczenie.
>
> Natknalem sie w dokumentacji biblioteki boost (
> http://www.boost.org/libs/random/rando... ) na nastepujace stwierdzenie:
> [cite]
> Caveat: std::time(0) is not a very good truly-random seed. When called in rapid
> succession, it could return the same values, and thus the same random number
> sequences could ensue.
> [/cite]
> Poszukalem w ksiazkach i jedyne co znalazlem to w ksiazce "Komputerowe
> generatory liczb losowych" Wieczorkowskiego i Zielinskiego propozycje, aby
> generatory inicjowac przy pomocy wartosci
> 1) r+100(m-1+12(d-1+31(g+24(min+60s))))
> lub
> 2) s+60(min+60(g+24(d-1+31(m-1+12r))))
> Gdyby przypadkiem liczby te byly parzyste dodac jeszcze do nich 1. (m - miesiac
> od 1 do 12, g - godzina od 0 do 23, min - minuta od 0 do 59, s - sekunda od 0 do
> 59, r - ostatnie dwie cyfry roku)

W czym to jest lepsze od time(NULL)? I uwaga: NULL, nie zero. time() nie
przyjmuje liczby tylko adres zmiennej (mimo ?e zero zostanie przyjete
bez zaj?kniecia).

> W necie natomiast nie znalazlem nic konkretnego.

Bo to jest *oczywiste*. Sam nawet zacytowa3e?.
[cite]
Caveat: std::time(0) is not a very good truly-random seed. When called in rapid
succession, it could return the same values, and thus the same random number
sequences could ensue.
[/cite]

--
<Kosma> Niektórzy lubi? dozziego...
<Kosma> Oczywi?cie szanujemy ich.
Stanislaw Klekot

Qbab

12/4/2006 12:12:00 PM

0

[...]
> Poszukalem w ksiazkach i jedyne co znalazlem to w ksiazce "Komputerowe
> generatory liczb losowych" Wieczorkowskiego i Zielinskiego propozycje, aby
> generatory inicjowac przy pomocy wartosci
> 1) r+100(m-1+12(d-1+31(g+24(min+60s))))
> lub
> 2) s+60(min+60(g+24(d-1+31(m-1+12r))))
> Gdyby przypadkiem liczby te byly parzyste dodac jeszcze do nich 1. (m -
miesiac
> od 1 do 12, g - godzina od 0 do 23, min - minuta od 0 do 59, s - sekunda
od 0 do
> 59, r - ostatnie dwie cyfry roku)
>
> W necie natomiast nie znalazlem nic konkretnego.
>
> Moze ktos z Grupowiczow mial problem podobny do mojego i zna jakies jego
"jak
> nabardziej losowe rozwiazanie" :)

to mo?e ja ci napisze jak ja to robie :)

stosuje taki generator który wymaga by ziarno by3o ujemne

robie sobie to tak:

CALL GETDAT(iy, imon, id)
CALL GETTIM(ih,im,is,i1)

nseed=(-(imon*100000000+ih*1000000+im*10000+is*100+i1))

zaleta jest taka ?e ziarno nigdy nie jest takie samo co pozwala mi sie
zabawic i porównac wyniki przy starcie symulacji przy roznych ziarnach :)
jak na razie nie znalazlem problemu w swojej pracy gdzie by takie podejscie
dawalo jakiekolwiek problemy.

ale poczytaj jeszcze takie publikacje:

Advances in Mathematics 188 (2004) 444-469 (J.H. Kima and V.H. Vub)

Computers and Mathematics with Applications 47 (2004) 217-226 (LAP-PIU LEE
AND KWOK-WO WONG)

to sobie przetestujesz czy Ci prawidlowo dziala a i sporo dono?ników w nich
by3o jak szukalem

pozdr. Qbab


Stachu 'Dozzie' K.

12/4/2006 12:20:00 PM

0

On 04.12.2006, Qbab <barbasz@poczta.onet.pl> wrote:
> CALL GETDAT(iy, imon, id)
> CALL GETTIM(ih,im,is,i1)
>
> nseed=(-(imon*100000000+ih*1000000+im*10000+is*100+i1))
>
> zaleta jest taka ?e ziarno nigdy nie jest takie samo co pozwala mi sie
> zabawic i porównac wyniki przy starcie symulacji przy roznych ziarnach :)

Uruchamiam cztery symulacje pod rz?d, jedna po drugiej. Co mówi3e?
o "nigdy takie samo"?

--
<Kosma> Niektórzy lubi? dozziego...
<Kosma> Oczywi?cie szanujemy ich.
Stanislaw Klekot

radarek

12/4/2006 1:07:00 PM

0


"adj" <a_d_jWYTNIJTO@poczta.onet.pl> wrote in message
news:6dc6.00000077.45740ad8@newsgate.onet.pl...
> Witam,
>
> Przez dosc dlugi czas wydawalo mi sie ze inicjalizowanie generatora
> liczb
> pseudolosowych za pomoca wartosci zwracanej przez wywolanie funkcji
> time, jest w
> miare dobrym pomyslem. Teraz jednak pisze program, w ktorym losowosc ma
> dosc
> istotne znaczenie.
>
> Natknalem sie w dokumentacji biblioteki boost (
> http://www.boost.org/libs/random/rando... ) na nastepujace
> stwierdzenie:
> [cite]
> Caveat: std::time(0) is not a very good truly-random seed. When called
> in rapid
> succession, it could return the same values, and thus the same random
> number
> sequences could ensue.
> [/cite]

To jest logiczne, zeby poprawic takie zachowanie nie wystarczy bardziej
"mieszac" czas, tylko albo skorzystac z czasu o wiekszej rozdzielczosci
(zeby uniknac takich samych seedow w jednej sekundzie - bo tak bedzie
rowniez w zaproponowanych przez ciebie metodach) albo nie ustawiac
seeda czesciej niz raz co sekunde (w ogole zachodzi potrzeba ustawiania
go czesciej?).

Qbab

12/4/2006 1:28:00 PM

0

> Uruchamiam cztery symulacje pod rz?d, jedna po drugiej. Co mówi3e?
> o "nigdy takie samo"?

nie wiem do konca czy chodzi ci o to co my?le :) ale postaram sie
odpowiedziea :)
nigdy takie samo oznacza ?e warto?a dla ziarna zmienia sie, i co w??ne jest
za ka?dym razem inna tzn nigdy sie nie powtarza oczywiscie przy za3o?eniu ?e
nie czytasz tego cze?ciej ni? zmienia sie "i1" z mojego tekstu czyli co
1/100 sek
niezbyt czesto (nigdy nie mów nigdy) owe ziarno jest potrezbne czesciej.
a poprzez porównanie przy ró?nych ziarnach to chodiz3o mi o to ?e puszczam
sobie symulacje (np. 2500 obiektów) i jak sie skonczy to nastepn? (i tak np.
4 razy co daje 10000 obiektów) - to ma t? zalete, ?e ja sam (szybko?a
pisania na klaiwaturze itp.) wprowadzam pewn? losowo?a :)
a ?e mi sie to liczy czasem i tydzien to nie jest to zbyt uci??liwe.
Pozdr.


Stachu 'Dozzie' K.

12/4/2006 1:36:00 PM

0

On 04.12.2006, Qbab <barbasz@poczta.onet.pl> wrote:
>> Uruchamiam cztery symulacje pod rz?d, jedna po drugiej. Co mówi3e?
>> o "nigdy takie samo"?
>
> nie wiem do konca czy chodzi ci o to co my?le :) ale postaram sie
> odpowiedziea :)
> nigdy takie samo oznacza ?e warto?a dla ziarna zmienia sie, i co w??ne jest
> za ka?dym razem inna tzn nigdy sie nie powtarza oczywiscie przy za3o?eniu ?e
> nie czytasz tego cze?ciej ni? zmienia sie "i1" z mojego tekstu czyli co
> 1/100 sek
> niezbyt czesto (nigdy nie mów nigdy) owe ziarno jest potrezbne czesciej.

Bingo. Co takiego twój sposób wnosi nowszego ni? zwyczajne u?ycie
warto?ci time(NULL)? Jako? nic nie widze, poza wiekszym skomplikowaniem.
Je?li masz kiepski generator pseudolosowy daj?cy podobne cykle przy
podobnym ziarnie, to nale?y zmienia generator zamiast pakowaa cuda
niewidy jako seed.

--
<Kosma> Niektórzy lubi? dozziego...
<Kosma> Oczywi?cie szanujemy ich.
Stanislaw Klekot

Bartek Dajewski

12/4/2006 1:50:00 PM

0

Cze?a.

U?ytkownik "adj" <a_d_jWYTNIJTO@poczta.onet.pl> napisa3 w wiadomo?ci
news:6dc6.00000077.45740ad8@newsgate.onet.pl...
> Witam,
>
> Przez dosc dlugi czas wydawalo mi sie ze inicjalizowanie generatora liczb
> pseudolosowych za pomoca wartosci zwracanej przez wywolanie funkcji time,
jest w
> miare dobrym pomyslem.

Ja nadal tak uwa?am, choa zastrzegam, ?e nie robi3em jakich? powa?nych
testów.

>Teraz jednak pisze program, w ktorym losowosc ma dosc
> istotne znaczenie.
>
> Natknalem sie w dokumentacji biblioteki boost (
> http://www.boost.org/libs/random/rando... ) na nastepujace
stwierdzenie:
> [cite]
> Caveat: std::time(0) is not a very good truly-random seed. When called in
rapid
> succession, it could return the same values, and thus the same random
number
> sequences could ensue.
> [/cite]

Tu jest jasno opisana podstawowa wada tej metody. IMHO - drobna wada, bo
przecie? nie ma specjalnego powodu, ?eby generator inicjowaa "in rapid
succession". Ja go inicjuje raz - przy starcie programu i ju?. Zak3adam, ?e
kolejne uruchomienia nie nast?pi? po sobie tak szybko, ?eby odstep by3
poni?ej dok3adno?ci zegara. Gdybym sie tego obawia3 lub gdybym chcia3 u?ywaa
wielu generatorów w jednym programie (choa nie bardzo wiem po co) -
zastosowa3bym zegar z lepsz? rozdzielczo?ci? lub jaki? globalny zasób, który
przechowywa3by ostatnio u?yt? warto?a inicjuj?c?. Tak czy inaczej tylko
raz - przy uruchomieniu programu. Dodatkowo - je?li u?ywany generator daje
lepszy rozrzut dopiero po kilku iteracjach - zaraz po zainicjowaniu
wywo3a3bym ka?dy generator kilka razy. Liczbe wywo3an dobra3bym
do?wiadczalnie.
--
Pozdrawiam :-)
Bartek

Qbab

12/4/2006 1:54:00 PM

0

> Bingo. Co takiego twój sposób wnosi nowszego ni? zwyczajne u?ycie
> warto?ci time(NULL)? Jako? nic nie widze, poza wiekszym skomplikowaniem.
nie no ja widze :) warto?a time(NULL?e sie trafia taka sama :) a u mnie nie.

> Je?li masz kiepski generator pseudolosowy daj?cy podobne cykle przy
> podobnym ziarnie, to nale?y zmienia generator zamiast pakowaa cuda
> niewidy jako seed.

a kto Ci powiedzia3 ?e jest kiepski :) z mojego do?wiadczenia bardzo
wygodny, poprawny i szybki. co wa?ne symulacje liczone ró?nymi generatorami
dawa3y takie same wyniki (w sensie globalnym) dlatego wybrany zosta3 do
dlaszych symulacji z tego samego zagadnienia ten najszybszy. czy widzisz
brak logiki w moim postepowaniu ? :)
pozdr.


Stachu 'Dozzie' K.

12/4/2006 2:12:00 PM

0

On 04.12.2006, Qbab <barbasz@poczta.onet.pl> wrote:
>> Bingo. Co takiego twój sposób wnosi nowszego ni? zwyczajne u?ycie
>> warto?ci time(NULL)? Jako? nic nie widze, poza wiekszym skomplikowaniem.
> nie no ja widze :) warto?a time(NULL?e sie trafia taka sama :) a u mnie nie.

Niby kiedy? W 2038? Nie roz?mieszaj mnie.

>> Je?li masz kiepski generator pseudolosowy daj?cy podobne cykle przy
>> podobnym ziarnie, to nale?y zmienia generator zamiast pakowaa cuda
>> niewidy jako seed.
>
> a kto Ci powiedzia3 ?e jest kiepski :)

Z faktu, ?e nie u?ywasz time(NULL) zgad3em, ?e boisz sie nadziewaa
generator podobnymi liczbami.

> z mojego do?wiadczenia bardzo
> wygodny, poprawny i szybki. co wa?ne symulacje liczone ró?nymi generatorami
> dawa3y takie same wyniki (w sensie globalnym) dlatego wybrany zosta3 do
> dlaszych symulacji z tego samego zagadnienia ten najszybszy. czy widzisz
> brak logiki w moim postepowaniu ? :)

Skoro generator jest niez3y, to widze brak logiki w wyborze seeda dla
generatora.

--
<Kosma> Niektórzy lubi? dozziego...
<Kosma> Oczywi?cie szanujemy ich.
Stanislaw Klekot

Stachu 'Dozzie' K.

12/4/2006 2:17:00 PM

0

On 04.12.2006, Bartek Dajewski <bartek@UsunTo.tradiss.com.pl> wrote:
> U?ytkownik "adj" <a_d_jWYTNIJTO@poczta.onet.pl> napisa3 w wiadomo?ci
> news:6dc6.00000077.45740ad8@newsgate.onet.pl...
>> Witam,
>>
>> Przez dosc dlugi czas wydawalo mi sie ze inicjalizowanie generatora liczb
>> pseudolosowych za pomoca wartosci zwracanej przez wywolanie funkcji time,
> jest w
>> miare dobrym pomyslem.
>
> Ja nadal tak uwa?am, choa zastrzegam, ?e nie robi3em jakich? powa?nych
> testów.

Zdrowy rozs?dek mówi, ?e je?li generator jest kiepski, to dobra sól mu
nie pomo?e, a do celów domowych (w odró?nieniu od zastosowan
kryptograficznych) nieprzewidywalno?a soli potrzebna nie jest.
Sól z za3o?enia ma zmieniaa wyniki generatora przy ka?dym uruchomieniu.

>>Teraz jednak pisze program, w ktorym losowosc ma dosc
>> istotne znaczenie.
>>
>> Natknalem sie w dokumentacji biblioteki boost (
>> http://www.boost.org/libs/random/rando... ) na nastepujace
> stwierdzenie:
>> [cite]
>> Caveat: std::time(0) is not a very good truly-random seed. When called in
> rapid
>> succession, it could return the same values, and thus the same random
> number
>> sequences could ensue.
>> [/cite]
>
> Tu jest jasno opisana podstawowa wada tej metody. IMHO - drobna wada, bo
> przecie? nie ma specjalnego powodu, ?eby generator inicjowaa "in rapid
> succession".

Zale?y od zastosowan. Testowa3em kiedy? ró?ne parametry algorytmu
genetycznego na niewielkich zestawach danych (program przyjmowa3
argumenty z wiersza polecen). Czas wykonania poni?ej 1s. Jako? nie
pali3em sie do petlenia funkcji main(), wola3em uruchamiaa w petli
shellowej ca3y program.

--
<Kosma> Niektórzy lubi? dozziego...
<Kosma> Oczywi?cie szanujemy ich.
Stanislaw Klekot