MKZR/Liczby losowe
Z Skrypty dla studentów Ekonofizyki UPGOW
(Różnice między wersjami)
(→Generacja liczb losowych) |
(→Generacja liczb losowych) |
||
Linia 3: | Linia 3: | ||
Generator liczb pseudolosowych to procedura, generująca deterministycznie ciąg bitów, który pod pewnymi względami jest nieodróżnialny od ciągu uzyskanego z prawdziwie losowego źródła. | Generator liczb pseudolosowych to procedura, generująca deterministycznie ciąg bitów, który pod pewnymi względami jest nieodróżnialny od ciągu uzyskanego z prawdziwie losowego źródła. | ||
- | Najprostrzym przykładem jest liniowy generator kongruencyjny (ang. LCG) | + | Najprostrzym przykładem jest liniowy generator kongruencyjny (ang. Linear congruential generator, LCG), który jest wyznaczony przez relację rekurencyjną: |
: <math>X_{n+1} = \left( a X_n + c \right)~~\bmod~~m</math> | : <math>X_{n+1} = \left( a X_n + c \right)~~\bmod~~m</math> | ||
+ | |||
+ | Jego implementacja w octave: | ||
<source lang="matlab"> | <source lang="matlab"> | ||
Linia 17: | Linia 19: | ||
</source> | </source> | ||
+ | przykład jego użycia do generacji pseudolosowych liczb z przedziału (0,1): | ||
<source lang="matlab"> | <source lang="matlab"> | ||
x(1)=123; | x(1)=123; | ||
Linia 22: | Linia 25: | ||
x(i)=myran(x(i-1)); | x(i)=myran(x(i-1)); | ||
disp(x(i)/2^32); | disp(x(i)/2^32); | ||
+ | end | ||
+ | </source> | ||
+ | |||
+ | |||
+ | Generator ten ma wiele mankamentów: | ||
+ | |||
+ | okres niskich bitów jest o wiele niższy od okresu całego generatora. | ||
+ | |||
+ | <source lang="matlab"> | ||
+ | x(1)=1234; | ||
+ | for bitn=1:10 | ||
+ | for i=2:30; | ||
+ | x(i)=myran(x(i-1)); | ||
+ | printf("Bit %d: %d\n", bitn,bitget(x(i),bitn) ); | ||
+ | end | ||
+ | a=input('cont?','s'); | ||
+ | if (a=='q') | ||
+ | break; | ||
+ | end | ||
end | end | ||
</source> | </source> | ||
+ | |||
+ | |||
+ | |||
+ | A further problem of LCGs is that the lower-order bits of the generated sequence h | ||
==Liczby o zadanym rozkładzie== | ==Liczby o zadanym rozkładzie== |
Wersja z 22:22, 4 sty 2010
Spis treści |
Generacja liczb losowych
Generator liczb pseudolosowych to procedura, generująca deterministycznie ciąg bitów, który pod pewnymi względami jest nieodróżnialny od ciągu uzyskanego z prawdziwie losowego źródła.
Najprostrzym przykładem jest liniowy generator kongruencyjny (ang. Linear congruential generator, LCG), który jest wyznaczony przez relację rekurencyjną:
- \(X_{n+1} = \left( a X_n + c \right)~~\bmod~~m\)
Jego implementacja w octave:
function y=myran(x); a=1664525; b=1013904223; m=2^32; y=mod(a*x+b,m); return; end
przykład jego użycia do generacji pseudolosowych liczb z przedziału (0,1):
x(1)=123; for i=2:10; x(i)=myran(x(i-1)); disp(x(i)/2^32); end
Generator ten ma wiele mankamentów:
okres niskich bitów jest o wiele niższy od okresu całego generatora.
x(1)=1234; for bitn=1:10 for i=2:30; x(i)=myran(x(i-1)); printf("Bit %d: %d\n", bitn,bitget(x(i),bitn) ); end a=input('cont?','s'); if (a=='q') break; end end
A further problem of LCGs is that the lower-order bits of the generated sequence h