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

Как реализовать генерацию псевдослучайных чисел по равномерному и гауссовому распределениям? - C++

Восстановить пароль Регистрация
 
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
08.02.2014, 16:47     Как реализовать генерацию псевдослучайных чисел по равномерному и гауссовому распределениям? #1
Собственно, вопрос в названии. Как реализовать генерацию псевдослучайных чисел по равномерному и гауссовому распределениям? (Диапазон чисел, получающихся при генерации, должен быть задаваем)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.02.2014, 16:47     Как реализовать генерацию псевдослучайных чисел по равномерному и гауссовому распределениям?
Посмотрите здесь:

сделать генерацию случайных чисел C++
Генератор псевдослучайных чисел. C++
генератор псевдослучайных чисел... C++
C++ генератор псевдослучайных чисел незнаю как доделать...
C++ Генератор псевдослучайных чисел
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
palva
 Аватар для palva
2372 / 1594 / 190
Регистрация: 08.06.2007
Сообщений: 6,362
Записей в блоге: 4
08.02.2014, 16:54     Как реализовать генерацию псевдослучайных чисел по равномерному и гауссовому распределениям? #2
А функцией rand можно пользоваться?
Hrobak
288 / 168 / 11
Регистрация: 22.03.2010
Сообщений: 483
Завершенные тесты: 1
08.02.2014, 16:56     Как реализовать генерацию псевдослучайных чисел по равномерному и гауссовому распределениям? #3
В С++11 есть uniform_int_distribution и normal_distribution.
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
08.02.2014, 17:42  [ТС]     Как реализовать генерацию псевдослучайных чисел по равномерному и гауссовому распределениям? #4
Никаких функций. Нужна собственная реализация.
palva
 Аватар для palva
2372 / 1594 / 190
Регистрация: 08.06.2007
Сообщений: 6,362
Записей в блоге: 4
08.02.2014, 17:51     Как реализовать генерацию псевдослучайных чисел по равномерному и гауссовому распределениям? #5
Тогда сначала реализуйте функцию rand конгруэнтным методом, а потом все остальное через нее.
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
08.02.2014, 19:22  [ТС]     Как реализовать генерацию псевдослучайных чисел по равномерному и гауссовому распределениям? #6
palva, ну вроде как сделал это, правда распределение получилось крайне-равномерным (если модуль, например, 16 (а мне нужен именно такой), то если я уже вывел 15 чисел, то со 100% вероятностью знаю, какое будет 16-ым - то, которое ещё не встречалось), но это ладно. Как их теперь преобразовать в гауссовское распределение? Встретил формулу:
http://www.cyberforum.ru/cgi-bin/latex.cgi?y(n) = \frac{1}{N}\sum_{i}^{N-1}x(nN - i)
Вставил n равный 43, N поставил 32, просуммировал и поделил на N и поделил по модулю 16, но вышла последовательность из 4 чисел.

Добавлено через 21 минуту
Добавлю так же, что решение обязано быть в целых числах (нельзя использовать не целые числа, типа "e")

Добавлено через 1 час 2 минуты
Всё что смог найти - нашел. Больше уже не найду. Поэтому никаких идей у меня по этому поводу нет. Собственно, нужна помощь. Изначально мне нужно реализовать задачу генерации чисел на ассемблере без дробных чисел в диапазоне от 0 до 0F. Мне бы формулы увидеть, а дальше я сам проверю на C, а потом и на ассемблер перегоню.
palva
 Аватар для palva
2372 / 1594 / 190
Регистрация: 08.06.2007
Сообщений: 6,362
Записей в блоге: 4
08.02.2014, 20:21     Как реализовать генерацию псевдослучайных чисел по равномерному и гауссовому распределениям? #7
Так не делают. Модуль берут большой 2^31, а в качестве результата возвращают 15 битов откуда-нибудь из середины числа. Так сделано в стандартных программах си и др. Конкретику с точными алгоритмами можно найти, но она вряд ли важна.

Добавлено через 1 минуту
Это если линейный конгруэнтный метод a=(a*p+s) mod m
palva
 Аватар для palva
2372 / 1594 / 190
Регистрация: 08.06.2007
Сообщений: 6,362
Записей в блоге: 4
08.02.2014, 20:40     Как реализовать генерацию псевдослучайных чисел по равномерному и гауссовому распределениям? #8
http://mf.grsu.by/Kafedry/sp_cs/acad...el_thi/lect_07
Миниатюры
Как реализовать генерацию псевдослучайных чисел по равномерному и гауссовому распределениям?  
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
08.02.2014, 20:40  [ТС]     Как реализовать генерацию псевдослучайных чисел по равномерному и гауссовому распределениям? #9
palva, как я уже сказал, нужны гауссные числа. Вышло распределение (пусть и без повторений) - ну и ладно, и так сойдет.
palva
 Аватар для palva
2372 / 1594 / 190
Регистрация: 08.06.2007
Сообщений: 6,362
Записей в блоге: 4
08.02.2014, 21:00     Как реализовать генерацию псевдослучайных чисел по равномерному и гауссовому распределениям? #10
Генератор дает целые числа. Преобразуете их в плавающие из диапазона [0,1). Складываете 12 последовательных таких чисел. Сумма распределена почти гауссово. Потом сложениями и умножениями подгоняете под нужное матожидание и дисперсию.

Добавлено через 3 минуты
Типа
C++
1
s=(s-6.0)*Sigma+Mean
Добавлено через 13 минут
У меня написано об этом в блоге. Правда там все на фортране.
http://www.cyberforum.ru/blogs/242513/blog1858.html
Есть другой метод генерации нормального распределения, но этот самый простой.
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
08.02.2014, 21:20  [ТС]     Как реализовать генерацию псевдослучайных чисел по равномерному и гауссовому распределениям? #11
Цитата Сообщение от palva Посмотреть сообщение
Преобразуете их в плавающие из диапазона [0,1)
как я писал, нужно решение в целых числах.
Цитата Сообщение от palva Посмотреть сообщение
Складываете 12 последовательных таких чисел
почему именно 12?
palva, я написал так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
for (i = 0; i < N; ++i)
    {
        y = 0;
        for (int j = 0, k = i; j < 12; ++j, ++k)
        {
            k %= N;
            y += xm[k];
        }
        y = (y - 6) * 3 + 1;
        y %= m;
        ym[i] = y; //массив чисел
        ++gy[y]; //для гистограммы
    }
однако гаусса нет. Я ошибся?
palva
 Аватар для palva
2372 / 1594 / 190
Регистрация: 08.06.2007
Сообщений: 6,362
Записей в блоге: 4
08.02.2014, 21:41     Как реализовать генерацию псевдослучайных чисел по равномерному и гауссовому распределениям? #12
Цитата Сообщение от nexen Посмотреть сообщение
как я писал, нужно решение в целых числах.
Ну и ради бога. Когда получите окончательное случайное число, округлите его до целого.
Цитата Сообщение от nexen Посмотреть сообщение
почему именно 12?
Обычно берут 12 взять меньше - будет быстрее работать, но распределение будет плохим. Взять больше распределение приблизится к гауссову, но больше работы.
Цитата Сообщение от nexen Посмотреть сообщение
однако гаусса нет. Я ошибся?
А где у вас реализация линейного конгруэнтного и т. д.
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
09.02.2014, 07:57  [ТС]     Как реализовать генерацию псевдослучайных чисел по равномерному и гауссовому распределениям? #13
Цитата Сообщение от palva Посмотреть сообщение
Ну и ради бога. Когда получите окончательное случайное число, округлите его до целого.
использовать дробные числа вообще нельзя - ни в рассчетах, ни в ответе
Цитата Сообщение от palva Посмотреть сообщение
А где у вас реализация линейного конгруэнтного и т. д.
C++
1
2
3
4
5
6
for (i = 0; i < N; ++i)
    {
        x = (a * x + c); // mod 256 (unsigned char)
        ++gx[x / m];
        xm[i] = x;
    }
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.02.2014, 11:16     Как реализовать генерацию псевдослучайных чисел по равномерному и гауссовому распределениям?
Еще ссылки по теме:

C++ Генератор псевдослучайных чисел
C++ С помощью генератора псевдослучайных чисел образовать последовательность целых чисел в диапазоне от 140 до 220 (см)
Генератор псевдослучайных чисел C++

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

Или воспользуйтесь поиском по форуму:
palva
 Аватар для palva
2372 / 1594 / 190
Регистрация: 08.06.2007
Сообщений: 6,362
Записей в блоге: 4
09.02.2014, 11:16     Как реализовать генерацию псевдослучайных чисел по равномерному и гауссовому распределениям? #14
Не надо делить на модуль, если это целые. Складывайте их как есть. 12 штук сложите - сумма будет распределена почти по Гауссу. gx это вы частоты что ли подсчитываете? Зачем? Сложение двенадцати это выработка одного числа. Вот эту выработку нужно произвести раз 1000 и тогда имеет смысл подсчитывать частоты этой суммы и получать колоколообразный график. Нормально распределенные числа, то есть эти суммы будут сильно размазаны. Диапазон [0,255*16]. Но все равно числа из середины диапазона будут более часты чем числа на краю.
Yandex
Объявления
09.02.2014, 11:16     Как реализовать генерацию псевдослучайных чисел по равномерному и гауссовому распределениям?
Ответ Создать тему
Опции темы

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