Vikipedio:Projekto matematiko/Mezo-kvadrata maniero
El Vikipedio
Ĉi tiu artikolo montras stilajn aŭ/kaj gramatikajn aŭ/kaj strukturajn problemojn kaj bezonas poluradon por konformi al pli bona nivelo de kvalito. Post plibonigo movu la artikolon al Mezo-kvadrata maniero (eble la nomo mem bezonas korekton) Se la ligo estas ruĝa, vi povas movi la artikolon. Se la ligo estas blua, la alia artikolo pri la temo jam ekzistas kaj tiun kaj ĉi tiun artikolon necasas kunigi. |
En matematiko, la mezo-kvadrata maniero estas maniero generi pseŭdohazardaj nombroj. En praktiko ĝi estas ne bona maniero, ekde ĝia (periodo, punkto) estas kutime tre mallonga kaj ĝi havas iujn kripligantajn malfortecojn. La maniero estis unue sugestita far Johano Von Neumann en 1946.
Ekzemple, por generi vicon de dek-ciferaj pseŭdohazardaj nombroj, oni devus krei dek-cifera komenca valoro kaj kvadratigi ĝin. La mezaj dek ciferoj de la rezulto devus esti la venonta nombro en la vico. Oni devus tiam kvadratigi tiun, kaj tiel plu.
Klare, por generilo de n-ciferaj nombroj, la (periodo, punkto) povas esti jam ne ol 10n. Se la mezaj dek ciferoj estas ĉiuj nuloj, la generilo tiam eligas nulojn eterne. Se la unua duono de nombro en la vico estas nuloj, la sinsekvaj nombroj malkreskos al nulo. Dum ĉi tiuj (kuras, rulas) de nulo estas facile detekti, ke ili okazi tro ofte per tiu maniero por praktika uzo.
Von Neumann konsciis pri tiuj problemoj, sed por liaj celoj la mezo-kvadrata maniero estis rapida (grava por uzo en la ENIAC), kaj ĝiaj eraroj estis facile detekteblaj (kiam ĝi fiaskis, ĝi ĝenerale fiaskis _spectacularly_).
Jeno estas simpla C++ programo, kiu generas la hazardan nombron donite komencan reston ni simboligas Zo = Xn en nia kazo pli supre.
#inkluzivi<iostream.h> dezerteca majno (rivero)() { _int_ n=0,a,c,m,Z[100]; flosi U[100]; _cout_<<"(enigi, eneniri) z "<<_endl_; _cin_>>Z[0]; _cout_<<"(enigi, eneniri) "<<_endl_; _cin_>>a; _cout_<<"(enigi, eneniri) c "<<_endl_; _cin_>>c; _cout_<<"(enigi, eneniri) m "<<_endl_; _cin_>>m; _cout_<<"n"<<"\t"<<"_Zn_"<<"\t"<<"Un"<<"\t"<<_endl_; _cout_<<"..."<<"\t"<<"..."<<"\t"<<"..."<<"\t"<<_endl_; fari { Z[n+1]=((Z[n]*a)+c)%m; se(Z[n+1]!=0) U[n+1]=(flosi)1/(Z[n+1]); alia Z[n+1]=0;
_cout_<<n<<"\t"<<Z[n+1]<<"\t"<<U[n+1]<<"\t"<<_endl_; n++; } dum(Z[n]!=Z[0]);
}
[redaktu] Vidu ankaŭ jenon:
- Lineara _congruential_ generilo
- _Blum_ _Blum_ _Shub_