Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
nexen
187 / 180 / 25
Регистрация: 27.01.2012
Сообщений: 1,335
1

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

08.02.2014, 16:47. Просмотров 768. Ответов 13
Метки нет (Все метки)

Собственно, вопрос в названии. Как реализовать генерацию псевдослучайных чисел по равномерному и гауссовому распределениям? (Диапазон чисел, получающихся при генерации, должен быть задаваем)
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.02.2014, 16:47
Ответы с готовыми решениями:

Реализовать генерацию новых псевдослучайных чисел при обращении к методу
Проблема заключается вот в чем: Я обращаюсь к методу "Inputrandom" 2 раза, но...

Как реализовать генерацию рандомных чисел в заданном диапазоне?
Я Хочу Сделать Генерацию Рандомный Чисел В Заданном Диапазоне ну например от...

Реализовать генерацию случайных чисел с помощью функции srand()
Ребят, есть функция srand(time(NULL)). Хочу поместить ее в цикл, чтоб с...

Реализовать генерацию случайных чисел для игры "Угадай число"
Всем привет!написал код для игры. По условию компьютер должен загадать число от...

Как работает алгоритм псевдослучайных чисел?
Здравствуйте. У меня есть вопрос. Как работает алгоритм псевдослучайных чисел в...

13
palva
3115 / 2245 / 452
Регистрация: 08.06.2007
Сообщений: 8,162
Записей в блоге: 4
08.02.2014, 16:54 2
А функцией rand можно пользоваться?
0
Hrobak
291 / 171 / 46
Регистрация: 22.03.2010
Сообщений: 487
Завершенные тесты: 1
08.02.2014, 16:56 3
В С++11 есть uniform_int_distribution и normal_distribution.
0
nexen
187 / 180 / 25
Регистрация: 27.01.2012
Сообщений: 1,335
08.02.2014, 17:42  [ТС] 4
Никаких функций. Нужна собственная реализация.
0
palva
3115 / 2245 / 452
Регистрация: 08.06.2007
Сообщений: 8,162
Записей в блоге: 4
08.02.2014, 17:51 5
Тогда сначала реализуйте функцию rand конгруэнтным методом, а потом все остальное через нее.
1
nexen
187 / 180 / 25
Регистрация: 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, а потом и на ассемблер перегоню.
0
palva
3115 / 2245 / 452
Регистрация: 08.06.2007
Сообщений: 8,162
Записей в блоге: 4
08.02.2014, 20:21 7
Так не делают. Модуль берут большой 2^31, а в качестве результата возвращают 15 битов откуда-нибудь из середины числа. Так сделано в стандартных программах си и др. Конкретику с точными алгоритмами можно найти, но она вряд ли важна.

Добавлено через 1 минуту
Это если линейный конгруэнтный метод a=(a*p+s) mod m
0
palva
3115 / 2245 / 452
Регистрация: 08.06.2007
Сообщений: 8,162
Записей в блоге: 4
08.02.2014, 20:40 8
http://mf.grsu.by/Kafedry/sp_cs/academic_process/el_thi/lect_07
1
Миниатюры
Как реализовать генерацию псевдослучайных чисел по равномерному и гауссовому распределениям?  
nexen
187 / 180 / 25
Регистрация: 27.01.2012
Сообщений: 1,335
08.02.2014, 20:40  [ТС] 9
palva, как я уже сказал, нужны гауссные числа. Вышло распределение (пусть и без повторений) - ну и ладно, и так сойдет.
0
palva
3115 / 2245 / 452
Регистрация: 08.06.2007
Сообщений: 8,162
Записей в блоге: 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
Есть другой метод генерации нормального распределения, но этот самый простой.
1
nexen
187 / 180 / 25
Регистрация: 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]; //для гистограммы
    }
однако гаусса нет. Я ошибся?
0
palva
3115 / 2245 / 452
Регистрация: 08.06.2007
Сообщений: 8,162
Записей в блоге: 4
08.02.2014, 21:41 12
Цитата Сообщение от nexen Посмотреть сообщение
как я писал, нужно решение в целых числах.
Ну и ради бога. Когда получите окончательное случайное число, округлите его до целого.
Цитата Сообщение от nexen Посмотреть сообщение
почему именно 12?
Обычно берут 12 взять меньше - будет быстрее работать, но распределение будет плохим. Взять больше распределение приблизится к гауссову, но больше работы.
Цитата Сообщение от nexen Посмотреть сообщение
однако гаусса нет. Я ошибся?
А где у вас реализация линейного конгруэнтного и т. д.
1
nexen
187 / 180 / 25
Регистрация: 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;
    }
0
palva
3115 / 2245 / 452
Регистрация: 08.06.2007
Сообщений: 8,162
Записей в блоге: 4
09.02.2014, 11:16 14
Не надо делить на модуль, если это целые. Складывайте их как есть. 12 штук сложите - сумма будет распределена почти по Гауссу. gx это вы частоты что ли подсчитываете? Зачем? Сложение двенадцати это выработка одного числа. Вот эту выработку нужно произвести раз 1000 и тогда имеет смысл подсчитывать частоты этой суммы и получать колоколообразный график. Нормально распределенные числа, то есть эти суммы будут сильно размазаны. Диапазон [0,255*16]. Но все равно числа из середины диапазона будут более часты чем числа на краю.
0
09.02.2014, 11:16
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.02.2014, 11:16

генератор псевдослучайных чисел незнаю как доделать...
воть он: #include &lt;iostream&gt; #include &lt;stdio.h&gt; #define RAND_MAX 32767 ...

сделать генерацию случайных чисел
Как сделать генерацию случайных чисел??

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


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

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

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