Форум программистов, компьютерный форум CyberForum.ru

Генерация псевдоравномерных чисел. В чем ошибка? - C++

Восстановить пароль Регистрация
 
telogrejka
0 / 0 / 0
Регистрация: 10.09.2013
Сообщений: 4
11.09.2013, 00:14     Генерация псевдоравномерных чисел. В чем ошибка? #1
Написал метод для генерации псевдоравномерных чисел. Для проверки считается математическое ожидание (среднее арифметическое). Т.к. интервал генерируемых чисел от 0 до 1, то M = 0,5. После подсчета выдает M = 0,425 что далеко от эталона. Алгоритм проверял, но не нашел в чем косяк.
Ниже приведен алгоритм и код программы.

Алгоритм имитации квазиравномерных чисел сводится к выполнению следующих операций:
1. Выбираются произвольные целые положительные числа в качестве значения a0, a1, b0, b1, c0, c1 .
2. Выбираются произвольные целые положительные числа в качестве начального значения Z01, Z02 , вычисляются значения Z11 = Z01 и Z12 = Z02.
3. Вычисляются значения Zt1, Zt2 по формулам:
Zt1 = (|a0 * Z01 - b0 * Z11|) mod c0,
Zt2 = (|a1 * Z02 - b1 * Z12|) mod c1;
4. Вычисляется искомое промежуточное значение x1 по формуле
xi = (|Zt1 – Zt2|) mod c0.
5. Полученное значение приводится к вещественному из интервала (0; 1), то есть вычисляется квазиравномерное значение x10..1 = x1 / c0 .
6. Модифицируются значения Z01 = Z11, Z11 = Zt1, Z02 = Z12, Z12 = Zt2.
7. Возврат на пункт 3.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include "stdafx.h"
#include <iostream>
#include <math.h>
 
using namespace std;
 
int _tmain(int argc, _TCHAR* argv[])
{
    setlocale(LC_ALL,"rus");
    //1
    const int IterCount = 10000; // Количество итераций
    int a0 = 14, a1 = 5;
    int b0 = 81, b1 = 139;
    int c0 = 4294, c1 = 9494;
    int Z01 = 13511, Z02 = 1477;
    int Zt1 = 0, Zt2 = 0;
    double x1 = 0;
    double x101 = 0;
    double M = 0;
    //2
    int Z11 = Z01, Z12 = Z02;
    //3
    for (int i = 1; i <= IterCount; i++)
    {
        Zt1 = abs(a0 * Z01 - b0 * Z11) % c0;
        Zt2 = abs(a1 * Z02 - b1 * Z12) % c1;
        //4
        x1 = abs(Zt1 - Zt2) % c0;
        //5
        x101 = x1 / c0;
        //6
        Z01 = Z11;
        Z11 = Zt1;
        Z02 = Z12;
        Z12 = Zt2;
        //Мат ожидание
        M += x101;
    }
    cout << "Z01 = " << Z01 << " Z11 = " 
            << Z11 << " Z02 = " << Z02 << " Z12 = " << Z12 << endl 
            << "Zt1 = " << Zt1 << " Zt2 = " << Zt2 << " x1 = " << x1 
            << " x101 = " << x101 << endl;
    cout << "Мат. ожидание M = " << M/IterCount << endl;
    return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.09.2013, 00:14     Генерация псевдоравномерных чисел. В чем ошибка?
Посмотрите здесь:

Генерация чисел C++
Генерация чисел C++
генерация чисел C++
Генерация чисел C++
C++ генерация чисел
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
zer0mail
2189 / 1872 / 187
Регистрация: 03.07.2012
Сообщений: 6,665
Записей в блоге: 1
11.09.2013, 00:49     Генерация псевдоравномерных чисел. В чем ошибка? #2
Цитата Сообщение от telogrejka Посмотреть сообщение
2. Выбираются произвольные целые положительные числа в качестве начального значения Z01, Z02...
А с чего Вы взяли, что любые числа дают хороший генератор?
grizlik78
Эксперт С++
 Аватар для grizlik78
1884 / 1416 / 102
Регистрация: 29.05.2011
Сообщений: 2,961
11.09.2013, 00:59     Генерация псевдоравномерных чисел. В чем ошибка? #3
А это известный метод?
Если я ничего не напутал, то гистограмма распределения в прикреплённых файлах (грубая и подетальнее).
На равномерное не похоже. Может наклон и есть "псевдо/квази"?
Миниатюры
Генерация псевдоравномерных чисел. В чем ошибка?   Генерация псевдоравномерных чисел. В чем ошибка?  
telogrejka
0 / 0 / 0
Регистрация: 10.09.2013
Сообщений: 4
11.09.2013, 13:48  [ТС]     Генерация псевдоравномерных чисел. В чем ошибка? #4
Метод в методичке называется "Сложный метод"

Добавлено через 9 часов 46 минут
Пробовал подставлять другие значения, не помогло
Yandex
Объявления
11.09.2013, 13:48     Генерация псевдоравномерных чисел. В чем ошибка?
Ответ Создать тему
Опции темы

Текущее время: 16:48. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru