3. Случайное число. Генераторы случайных чисел Случайные числа - это случайные величины, которые равномерно распределены на интервале [0, 1] и (стохастически) независимы. Случайные, или переменные, величины - это вероятностные переменные; они введены по контрасту с переменными, значения которых можно установить заранее. Случайные числа (независимые)- равномерные случайные величины. Случайные числа имеют следующие две характеристики: 1. Если ri (i=1, 2, 3,…) есть случайные числа, то их кумулятивное распределение, обозначим его F, удовлетворяет уравнению (21) для всех i (см. рис. 28). F(ri)=P(r<ri) =ri для 0 £ ri £ 1, =0 для ri<0, =1 для ri>1. (21) 2. Теоретически случайные числа должны быть непрерывными переменными с функцией плотности f, определяемой следующим выражением: f(ri)=1 для 0 £ ri £ 1, =0 для всех других значений. (22) Независимость случайных чисел имеет своим следствием тот факт, что знание r1, r2,…,r i-1 не дает нам никакой информации об ri. Случайные числа вырабатываются в машине при помощи чисто детерминированных рекурсивных формул. При этом получаются псевдослучайные числа, их статистические свойства совпадают со статистическими свойствами чисел, генерируемых идеальным случайным механизмом, вырабатывающим числа из интервала [0, 1], независимые и с одинаковой вероятностью. К идеальному генератору применяются следующие требования: полученные с его помощью последовательности должны состоять из 1) равномерно распределенных, 2) статистически независимых, 3) воспроизводимых, 4) неповторяющихся чисел. Кроме этого генератор должен 5) работать быстро и 6) занимать мало места в памяти машины. Разработаны два основных конгруэнтных метода построения случайных чисел: мультипликативный и смешанный. Все конгруэнтные методы основаны на рекуррентной формуле n i+1=(lni+m) mod m, (23) где ni, m, l, m - целые положительные числа. Запишем первые члены этой последовательности при i=1, 2, 3 n1=(ln0+m ) mod m n2=ln1+m =(l2n0+(l +1)m )mod m n3=(l3n0+(l2+l +1)m =( l3n0+m (l3-1)/(l -1))mod m (24) ni=(lin0+m (li -1)/(l -1))mod m Если дано начальное значение n0, множитель l и аддитивная константа m, то формула определяет последовательность целых чисел {n1, n2,…ni,…}, составленную из остатков деления на m членов последовательности {(lin0+m (li -1)/(l -1))} для любых i>=1, ni<=m. По целым числам последовательности {ni} можно построить последовательность {ri}={ni/m} рациональных чисел из интервала [0,1]. Обозначим через h - наименьшее положительное число, при котором nh=n0 mod m . Число h называется периодом последовательности {ni}. Величина h существенна, так как выполнение равенства nh=n0 mod m влечет за собой nh+1=n1, nh+2=n2 и т.д. Таким образом, последовательность {ni} будет периодической, т.е. значения ее членов будут повторяться через h номеров. Необходимо выбрать такие n0, l, m и m, чтобы h был максимальным. Рассмотрим алгоритм для случая двоичных машин. В этом случае m=2b, где b –число двоичных цифр в машинном слове. Максимальным периодом такой последовательности будет 2 b-2. Алгоритм построения последовательности с максимальным периодом: 1. Выбрать в качестве параметра n0 произвольное нечетное число. 2. Вычислить l по формуле l=8*t(+-)3, где t-любое целое положительное число. 3. Вычислить произведение ln0. Оно содержит не более 2b значащих разрядов. Взять b младших разрядов в качестве первого члена последовательности n1, остальные отбросить. 4. Вычислить дробь из интервала [0, 1] по формуле r1=n1/2b. 5. Вычислить очередное псевдослучайное число n i+1 как b правых разрядов произведения lni и вернуться к пункту 4. Рассмотрим пример для b=4. Процедура должна определить 4 разных числа (h=2 4-2=4). 1. Положим n0=7, в двоичной записи n0=0111. 2. При t=1 коэффициент l можно взять равным 11 или 5, выберем 5 в двоичной записи t=0101. 3. ln0=5*7=(0101)*(0111)=35=(00100011), выбираем правые 4 разряда n1=0011 и r1=3/16=0.1875 4. ln1=(0101)*(0011)=00001111,отсюда n2=1111 и r2=15/16=0.9375 5. ln2=(0101)*(1111)=01001011,отсюда n3=1011 и r3=11/16=0.6875 6. ln3=(0101)*(1011)=00110111,отсюда n4=0111 и r4=7/16=0.4375 Различные наборы параметров изучались на предмет идеального генератора и для 32-x разрядных машин хорошие свойства показали генераторы с l=513=1220703125, n0=513 и m=231-1. Обозначая n0=N1, n=N, r=R, программу генерации случайных чисел можно записать в виде 5 INPUT “ ВВЕДИТЕ N0”;N1 10 N=1220703125*N1 20 IF N>=0 THEN 40 30 N=N+214783647+1 40 N1=N 50 R=N 60 R=R*0.4656613E-9:PRINT R
Число R будет искомым числом, на вход программы подается исходное число n0=513. В языке GWbasic, к сожалению, эта программа работать правильно не будет, так как максимальные целые числа должны быть в диапазоне –32768, +32767. Хорошими параметрами показали себя также числа l=75=16807 и m=231-1. Мультипликативный метод является частным случаем предыдущего при l=0, опирается на формулу ni+1=lni mod m (25) и задает последовательность неотрицательных целых чисел {ni}, не превосходящих m. Если взять m равным наибольшему простому числу, которое меньше чем 2b и l=Öm , то максимальный период будет m-1. Для получения случайных чисел предлагается такой алгоритм: 1. Берем число x0 содержащее < 9 знаков. 2. Умножаем его на l с числом знаков >5. 3. Умножаем результат на 1/m. 4. Берем дробную часть результата 3. 5. Исключить из числа, полученного на шаге 4 запятую и использовать его в качестве х умножаемого на l в шаге 2. 6. Повторять шаги 2-5 до получения нужного количества случайных чисел. В работе Теннат-Смита [6] была предложена аналогичная формула R n+1=M*Rn-D*INT(M*Rn/D), (26) которая при соответствующем подборе целых чисел M и D вырабатывает случайные целые числа в интервале от 1 до D-1. Отличную пару представляют числа M=8192 и D=67101323. Число D должно быть больше M*(M-1) и меньше M2 .Числа M=10 и D=97 можно взять для проверки работы нижеследующего алгоритма, который также трудно реализуем на Basic из-за ограниченного диапазона целых чисел. 10 M=8192:D=67101323 20 B=M*M-D 30 INPUT”ВВЕДИТЕ ДЛИНУ СЕРИИ”;N 40 INPUT”ВВЕДИТЕ НАЧАЛЬНОЕ ЦЕЛОЕ ЧИСЛО (ОТ 1 ДО D-1);S 50 R=S 60 FOR I=1 TO N 70 C=INT(R/M) 80 R=B*C+M*(R-M*C) 90 IF R>D THEN R=R-D 100 PRINT R,R/D 110 NEXT Модели задачи, использующие генераторы случайных чисел
|