Previous Page  12 / 25 Next Page
Information
Show Menu
Previous Page 12 / 25 Next Page
Page Background

Генератор равномерных случайных величин по технологии полного вихревого массива

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));