Генератор равномерных случайных величин по технологии полного вихревого массива
ISSN 0236-3933. Вестник МГТУ им. Н.Э. Баумана. Сер. Приборостроение. 2017. № 2
97
case 102: // следующий вихрь с прежними a и c
nW++; // следующий бит сдвига в слове
if (nW < w) { st = 103; break; }
nT++;//начало вихря со следующей величины
nW = 0; // условно без сдвига
if (nT < N) st = 103; // следующий вихрь
else st = 201; // следующая константа c
break;
case 103: // следующий вихрь
DeonYuli_Twist(); // следующий вихрь
nV = 0; // номер начального значения
st = 101; // выборка из массива x
break;
case 201: // заменить вихрь по c
c += 2; // следующая константа c
if (c <= ce) st = 2; // новый вихрь
else st = 202; // следующая константа a
break;
case 202: // заменить интервал по a
c = cb; // начальное значение c
if (nA == 1) nA = 2; else nA = 1;//замена
if (nA == 1) st = 203; // интервал a1
else st = 204; // интервал a2
break;
case 203: // новое значение из a1
a1 -= 4;
a = a1;
if (a1b <= a1) { a1s = 1; st = 2; }
else { a1s = 2; st = 205; }// a1 исчерпан
break;
case 204: // новое значение из a2
a2 += 4;
a = a2;
if (a2 <= a2e) { a2s = 1; st = 2; }
else { a2s = 2; st = 205; }// a2 исчерпан
break;
case 205: // один из a1 или a2 пройден
if (a2s != 2) st = 204;
else if (a1s != 2) st = 203;
else st = 1; // общее начало
break;
} // switch
} // while
return x[nV++]; // случайная величина
}
//---------------------------------------------------------------
void DeonYuli_Cong(int a, int c)
{ x[0] = x0; // начало последовательности
for (int i = 1; i < N; i++)
x[i] = (int)( (a * x[i - 1] + c) & maskW );
}
//---------------------------------------------------------------
void DeonYuli_Twist()
{ uint z = (uint)((x[0] & maskU) >> (w - 1)); // левый
for (int j = 0; j < N - 1; j++)
{ uint g = (uint)((x[j + 1] & maskU) >> (w - 1));