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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
telogrejka
0 / 0 / 0
Регистрация: 10.09.2013
Сообщений: 4
#1

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

11.09.2013, 00:14. Просмотров 409. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.09.2013, 00:14
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Генерация псевдоравномерных чисел. В чем ошибка? (C++):

В чем ошибка? В массиве целых чисел найти количество максимальных элементов - C++
#include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; #include &lt;time.h&gt; #define N 16 #define A 0 #define B 5 void Init(int *a, int n) { ...

генерация чисел - C++
написать прогу, которая генерирует последовательность из 10 случайных чисел в диапозоне от 1 до 10, выводит эти числа на экран и вычисляет...

Генерация чисел - C++
Помогите написать программу, а мучусь уже два часа. :) Нужно сгенерировать 30 трёхзначных чисел, и что бы в цифры этих чисел не были...

Генерация чисел - C++
Доброго времени суток, не могли бы вы подсказать как выбрать рандомно число из двух чисел 2 и 4 и в диапозоне от 1 до 4 благодарю

генерация чисел - C++
Скажите, пожалуйста, как сгенерировать случайным образом отрицательные числа?

Генерация чисел - C++
Вообщем мне нужно сгенерировать отрицательное вещественное число с 2 цифрами целой и 2 цифрами дробной части. Отрицательное ведь так...

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

Добавлено через 9 часов 46 минут
Пробовал подставлять другие значения, не помогло
0
11.09.2013, 13:48
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.09.2013, 13:48
Привет! Вот еще темы с ответами:

Генерация чисел - C++
Нужно программа для генерации тризначных чисел и таких, что бы в этих числах них не было парных цифр. ТИпу, если число &quot;ХХХ&quot;, то &quot;Х&quot; не...

Генерация уникальных чисел - C++
Посоветуйте способ генерации УНИКАЛЬНЫХ чисел, чтобы для бинарного дерева подошли... Спасибо

Генерация простых чисел - C++
Всем привет! Кто знает не сложные и быстрые алгоритмы генерации больших простых и псевопростых чисел, тест ферма что работает не...

Генерация случайных чисел - C++
Мне нужно заполнить множество матриц числами 0 или 1. Для этого использую функцию rand. Но мне необходима совсем случайная...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru