ГОСТРИСО 28640 - 2012
REM /• наминализацня milP| с начальным значением ♦/
LET nu(0) = And32(s . MskF_f)
FUNCTION init_gcnrand(s)!void init_gcnrand< unsigned long s) {
!mt(0)= s & OxffffffffUL;
FOR mti = 1 TO P - I
!for (mti=l; mti<P: mti++) {
LET mt(mti) = Mul32U( 1664525 , mt(mti-l)) + 1
! mt| mti | = (1664525UL ♦ mt|mti-l| + IUL):
LET mi(mti) = And32(mt(mti) . MskF_f)
! mt(mti] &= OxffffffffUL:
NEXT mti
!1
END FUNCTION
!)
КЕМ
tl»*9******»*4l**i»*4*«iM>i»*l******«•*•***«»*»**»***p»4i4«**•*«*#4*•*«-*4>*Ф**4<1»***/
КЕМ /* генерация случайного числа из интервала (O.Qxffffffff) ■»/
FUNCTION genrand
! unsigned long gcnrand(void){
DECLARE NUMERIC у
DIM magOl(2)
LET magOI(O) = 0
! unsigned long y:
LET magOI(l) = MATRIX,AIstatic unsignedlong magOl (2)={0x0UL.
MATRIX_A J;
/* magOl(x) = x ♦ MATRIX,A for x=0.l •/
IF mti >= P THEN
! if (mti >= P) |
DECLARE NUMERIC kk
!* генерация P слов одновременно */
! int kk:
IF mti = P + 1 THEN
! if (mti == P+I)
/* если init_gcnrand() нс вызван */
LET у = init_genrand(5489>
/* использована ошибочная инициализация S*/
END IF
! init_gcnrand(5489UL);
FOR kk=0 TO P-Q-l!for (kk=():kk<P-Q:kk++) l
LET у = Xor32(And32(mt(kk) , UPPER.MASK)
And32<mt(kk+1) , LOWER_MASK))
. ! у = (mt lkk| &UPPER, MASK) 1<mt
|kk+1J &LOWER_MASK):
LET mt(kk) = Xor32(Xor32( mt(kk+Q) , SR32U(y , 1)) , !
magOl(And32(y , 1)))
mijkkj = mt|kk+Q| Л( у » 1) AmagOlly
& OxlULJ;
NEXT kk
! »
FOR kk=kk TO P-2
!for (:kk<P-l:kk++) {
LET у = Xor32(And32<mt(kk) . UPPER MASK) .
And32(mt(kk+1) , LOWER.MASK))
!y = (mt [kk) & UPPER MASK) 1<mt[kk+l]
&LOWER.MASK):
LETmt(kk)=Xor32(Xor32(mi(kk+Q-P)
SR32U(y . I)) . magOKAnd32(y . 1)))
NEXT kk
. ! mt|kk] a mt|kk+(Q-P)| A(y »I) Л
magOl ]y & Ox 1UL|;
! 1
33