С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Вычислить функцию и вывести значения в виде таблицы. Ошибка "Undeclared identifier" http://www.cyberforum.ru/cpp-beginners/thread952145.html
Задание: написать программу, которая должна работать при разных значениях параметров, введенных пользователем. В программе определить структуру с полями a, b, x1, x2 типа double с указателем на...
C++ 18. Написать программу, которая решает уравнение с одним неизвестным и выводит в консоль значение неизвестного. Уравнение посимвольно вводится с клави #include <iostream> using namespace std; void main() { int urov1 = 0; int urov2 = 0; int urov3 = 0; float stad = 0; cout << "Enter the number of: ax="; cin >> urov1; http://www.cyberforum.ru/cpp-beginners/thread952144.html
Прокомментируйте пожалуйста C++
Не до конца понимаю код программы. Прошу дать комментарии к коду. #include "stdafx.h" #include <iostream> #include<math.h> using namespace std; int main() { const int max = 4;
C++ Random for double:(
Задание: Создать функцию random(a, b), которая возвращает случайное вещественное число от вещественного числа a включительно до вещественного числа b не включительно. И что такое...
C++ Написать программу, которая решает уравнение с одним неизвестным и выводит в консоль значение неизвестного. Уравнение посимвольно вводится с клавиатур http://www.cyberforum.ru/cpp-beginners/thread952130.html
Заупутался :-(
C++ Постороить из 2 мерного массива в 1 мерный, который содержит все элементы 2 мерного массива , содержащихся по периметру массива Постороить из 2 мерного массива в 1 мерный, который содержит все элементы 2 мерного массива , содержащихся по периметру массива. подробнее

Показать сообщение отдельно
telogrejka
0 / 0 / 0
Регистрация: 10.09.2013
Сообщений: 4

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

11.09.2013, 00:14. Просмотров 410. Ответов 3
Метки (Все метки)

Написал метод для генерации псевдоравномерных чисел. Для проверки считается математическое ожидание (среднее арифметическое). Т.к. интервал генерируемых чисел от 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;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.