Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
0 / 0 / 0
Регистрация: 10.09.2013
Сообщений: 4
1

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

11.09.2013, 00:14. Показов 831. Ответов 3
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Написал метод для генерации псевдоравномерных чисел. Для проверки считается математическое ожидание (среднее арифметическое). Т.к. интервал генерируемых чисел от 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.09.2013, 00:14
Ответы с готовыми решениями:

Найти максимальное из 4 целых чисел с помощью процедуры для 2 целых чисел. В чем ошибка?
найти максимальное из 4 целых чисел с помощью процедуры для 2 целых чисел var a,b,c,d,max:integer;...

Найти элемент в массиве реальных чисел и его номер среди чисел, больше чем 7.8 и меньше чем 50.2
Найти элемент массиву реальных (дійсних) чисел (12.37, 2.43, 16.55, 0.81, 0.32, 1.345, -12.18,...

Найти элемент в массиве реальных чисел и его номер среди чисел, больше чем 7.8 и меньше чем 50.2
Найти элемент массиву реальных (дійсних) чисел (12.37, 2.43, 16.55, 0.81, 0.32, 1.345, -12.18,...

Определение чисел-палиндромов. В чём ошибка?
Написал программу все работает, но когда например вожу число 78787, то выдает, что НЕ палиндром. В...

3
2664 / 2239 / 240
Регистрация: 03.07.2012
Сообщений: 8,141
Записей в блоге: 1
11.09.2013, 00:49 2
Цитата Сообщение от telogrejka Посмотреть сообщение
2. Выбираются произвольные целые положительные числа в качестве начального значения Z01, Z02...
А с чего Вы взяли, что любые числа дают хороший генератор?
0
Эксперт С++
2381 / 1665 / 279
Регистрация: 29.05.2011
Сообщений: 3,399
11.09.2013, 00:59 3
А это известный метод?
Если я ничего не напутал, то гистограмма распределения в прикреплённых файлах (грубая и подетальнее).
На равномерное не похоже. Может наклон и есть "псевдо/квази"?
Миниатюры
Генерация псевдоравномерных чисел. В чем ошибка?   Генерация псевдоравномерных чисел. В чем ошибка?  
0
0 / 0 / 0
Регистрация: 10.09.2013
Сообщений: 4
11.09.2013, 13:48  [ТС] 4
Метод в методичке называется "Сложный метод"

Добавлено через 9 часов 46 минут
Пробовал подставлять другие значения, не помогло
0
11.09.2013, 13:48
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.09.2013, 13:48
Помогаю со студенческими работами здесь

В чем ошибка в задаче вывода N чисел?
Вывести на экран n единиц, 2n двоек, затем 3n троек. Число вводит пользователь. Single n; ...

Среднее Арифметическое чисел в Си Ошибка в чём?
Нужно написать программу, которая вычисляет среднее арифметическое вводимой с клавиатуры...

Сложение двух длинных целых чисел, в чем ошибка?
Во входном файле записано два неотрицательных целых числа, не превышающих 10^100, по одному в...

В чем ошибка? В массиве целых чисел найти количество максимальных элементов
#include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; #include &lt;time.h&gt; #define N 16 #define A 0 #define B 5...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru