Проверка статистической независимости
Проверка независимости чисел на выходе ГСПЧ обычно производится путем измерения корреляции между и , где g > 0 – некоторое смещение. В случае, если установлена равномерность распределения, оценка коэффициента корреляции между и может быть получена по формуле
(8)
Здесь - оценка м.о. произведения чисел и (т.е. среднее значение произведений пар чисел, отстоящих в выборке на g шагов друг от друга):
(9)
где сумму Sg можно накапливать в процессе генерации выборки. В случае независимости псевдослучайных чисел для любого должно выполняться условие при , которое означает попарную некоррелированность чисел. Следует обратить внимание на то, что некоррелированность является необходимым, но не достаточным условием независимости случайных величин.
Проверка длины периода
Поскольку последовательность чисел на выходе мультипликативного конгруэнтного ГСПЧ периодическая, она не может характеризоваться равномерным распределением и независимостью чисел в строгом смысле , но при большой длине l периода этот недостаток не приводит к ошибкам более существенным, чем, скажем, ограниченная длина разрядной сетки ЭВМ.
Выявление периода последовательности или, что то же самое, в последовательности и определение его длины l – непростая задача, поскольку некоторое число первых членов последовательности может и не принадлежать его периодической части.
Определенную информацию о периодичности можно получить, если запомнить и в процессе генерации выборки последовательно сравнивать с ним числа , i=2,3,…,n. При первом совпадении определяется длина периода l = i-1. Если для совпадения не произошло, то либо , либо периодическая часть последовательности начинается при i > 1.
Контрольные вопросы
1. Как по выборке случайной величины рассчитываются оценки ее м.о. и дисперсия?
2. Как проверяется равномерность распределения чисел с помощью частотного теста?
3. Как проверяется статистическая независимость чисел на выходе ГСПЧ?
Задания к работе
1. Изучите способы анализа равномерности распределения и независимости чисел на выходе ГСПЧ.
2. Дополните программу из лабораторной работы №1 следующим функционалом:
- тестирование равномерности распределения ГСПЧ частотным методом разбиения на 10 интервалов (построить два графика , для n=100 и n=10000, где - частота встречаемости случайной величины на i-интервале);
- проверка равномерности распределения нахождением м.о. и дисперсии по формулам (6) и (7) (для n=100 и n=10000);
- (дополнительно, по усмотрению студента) проверка статистической независимости по формуле (8). Построить график Rg(n), для n от 10 до 1000;
3. По рассчитанным оценкам сделайте вывод о пригодности ГСПЧ. Если ГСПЧ не пригоден, подберите для него более подходящие параметры a,m.
Содержание отчета о работе
1. Цель работы;
2. формулы для расчета статистических оценок, применяемых для анализа качества ГСПЧ;
3. результаты расчета оценок (скриншоты), показывающие в графическом виде зависимость этих оценок от длины n выборки;
4. вывод о пригодности ГСПЧ для его использования в статистическом моделировании.
5. листинг программы
Рекомендации по выполнению лабораторной работы
Для выполнения данной работы следует обратиться к программе, написанной в лабораторной работе №1 и добавить в программу функции, соответствующие данной работе.
1. Откройте проект с программой в C++ Builder 6 (лабораторная работа №1);
2. Добавьте на форму объект PageControl с вкладки Win32:
3. Нажмите правой кнопкой мыши на данном объекте и выберите пункт NewPage (для создания двух вкладок – 2 клика);
4. Растяните данный объект по размеру формы приложения, оставив свободное место для него перемещением имеющихся объектов в любое свободное пространство на форме;
5. Переместите все существующие объекты на объект PageControl использованием выделения и копированием их у буфер обмена сочетанием клавиш ctrl+x и вставкой в PageControl с помощью ctrl+c. Переименуйте вкладки TabSheet1 и TabSheet2 в «Генерация чисел» и «Проверка генератора» соответственно (для этого кликните по объекту PageControl и слева, в object tree view выберите TabSheet1, переименуйте его в параметре Caption окна Object Inspector на «Генерация чисел»).
6. Последующие работы будут добавляться наращиванием функционала данной программы добавлением новых вкладок;
7. Перейдите на вкладку «Проверка генератора» и установите 3 новых объекта Chart с добавлением в каждый из них по одному графику Series. Дайте название каждому из графиков как указано на изображении (двойной клик на объекте Chart, на вкладке Titles)
8. Графики будут соответствовать следующим результатам: первые 2 графика для проверки частотным методом. Один график – зависимость частоты встречаемости случайной величины на каждом из интервалов разбиения, от номера интервала для N=100, другой – для N=10000. Третий график будет соответствовать зависимости коэффициента корреляции Rg от N (N следует брать от 10 до 10000).
9. Добавьте на форму кнопку Button, в поле caption дайте ей название («Начать тестирование ГСПЧ»). Добавьте 2 компонента Memo:
10. Вам необходимо на кнопку «Начать тестирование ГСПЧ» назначить необходимые действия для заполнения всех трех графиков.
11. Первым, что должна выполнить программа – сгенерировать первые 100 псевдослучайных чисел. Код можете скопировать с кнопки, генерирующей числа из первой лабораторной работы в кнопку «Начать тестирование ГСПЧ», но с изменением одного параметра – генерация фиксированного количества чисел, равному 100.
12. Код необходимо модифицировать так, чтобы сгенерированные числа записывались в массив. Инициализация массива на 100 чисел в С++ выглядит следующим образом:
float A[100];
13. По нажатию кнопки заполнение массива псевдослучайными числами можно реализовать следующим образом:
…
for (int i=0;i<100;i++)
{
//Здесь вы генерируете случайное число Х с помощью кода из лаб.№1//
A[i]= X; // присваиваем i-му элементу массива значение Х
}
….
14. Проверьте, правильно ли заполнился массив A[i] выводом его содержимого в компонент Memo:
for (int i=0;i<100;i++)
Memo2->Lines->Add(A[i]);
15. Следующий этап – подсчет количества случайных величин в интервалы равной длины, составляющие всю сгенерированную последовательность. Разобьем последовательность на 10 интервалов: 0-0,1; 0,1-0,2; 0,2-0,3; 0,3-0,4; 0,4-0,5; 0,5-0,6; 0,6-0,7; 0,7-0,8; 0.8-0,9; 0,9-1,0. Реализация подсчета числа попавших чисел в интервалы может быть получена путем нахождения целого числа от умножения элемента A[i] (случайная величина) на 10 и прибавлением единицы. Например, если случайное число «0,25» умножить на 10 и отбросить дробную часть, то мы получим число 2, добавив единицу, получим номер интервала, равный 3 (действительно, 0,25 находится в интервале 0,2-0,3). Для проверки правильности подсчета, установите еще один компонент Memo и выводите в него значения номеров интервалов. Проинициализировав новый массив B[10], содержащий информацию о каждом из интервалов, можно реализовать подсчет случайных чисел в каждом из интервалов следующим образом (выделение целой части можно сделать указанием (int) перед выводом числа):
for (int i=0;i<100;i++)
{
Memo2->Lines->Add(A[i]); //выводим случайную величину
buff=A[i]*10+1; // определяем номер интервала, которому она принадлежит
Memo3->Lines->Add((int)buff); //выводим номер этого интервала
B[(int)buff]+=1; //добавляем к счетчику единицу
}
случайная величина номер интервала
16. В массиве B[i] у нас теперь подсчитано количество попавших чисел для каждого из интервалов. Выведем на первый график значения из массива B:
for (int i=0;i<10;i++)
Series4->AddXY(i,B[i]/100); // отношение попавших в интервал значений к общему их числу(определение fi)
17. Сделаем копию блока кода для N=100 и поместим его следующим за текущим.
18. В скопированном блоке внесем изменения, которые позволят генерировать 10000 значений и подсчитывать их число в каждом из десяти интервалов (заменим в циклах 100 на 10000).
19. Отобразим на втором графике частоты встречаемости случайных величин на каждом из 10 интервалов:
20. Как видим, при переходе к N=10000 частотная составляющая приближается к вероятности попадания на каждый из интервалов, а именно: 1/k=0,1.
21. поместим на форму 4 компонента Edit для вывода значений м.о. и дисперсии для N=100 и N=10000
22. Найдем значения м.о. для N=100 и N=10000 по формуле (6). Выводить полученные значения необходимо следующим образом:
Edit9->Text=Mx; // Mx – найденное м.о. для 100 чисел, Edit может быть у вас под другим номером
Edit10->Text=Mx;// найденное м.о. для 10000 чисел, Edit может быть у вас под другим номером
23. Сгенерируйте несколько выборок и следите за получаемыми значениями Mx. Для N=10000 они должны быть ближе к 0,5, чем при N=100.
24. В остальные 2 поля выводите значения дисперсии для N=100 и N=10000 по формуле (7).
25. Значение дисперсии с ростом N должно стремиться к 0,83333333 (1/12) и быть ближе к нему у выборки с N=10000.
26. (дополнительно, по усмотрению студента) Рассчитайте значение Rg корреляции между парами чисел из выборки (g взять равным единице) при N от 10 до 1000 (генерируем 10 чисел, считаем Rg по формуле (8), выводим это значение на график, потом генерируем 11 чисел, считаем Rg и выводим на график, потом 12, 13 чисел и т.д. до 1000). Полученная кривая должна отражать приближение коэффициента корреляции Rg к нулю с ростом N:
27. Подпишите оси на вкладке Axis каждого из графиков как указано на рисунке:
Лабораторная работа 3