Форум программистов, компьютерный форум, киберфорум
Алгоритмы
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
 Аватар для VladSharikov
25 / 25 / 7
Регистрация: 02.12.2010
Сообщений: 824

Генерирование случайного числа по заданному закону

21.09.2013, 18:54. Показов 1718. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Построить программный генератор случайных чисел с заданным законом распределения. Рекомендуется использовать метод обратных функций.
Это задача. Как построить такое генератор?
Понятно есть разные функции rand() и т.п. в разных языках, но как привязать это к закону распределения?

Плотность распределения вероятностей:
https://www.cyberforum.ru/cgi-bin/latex.cgi?f(z)=\sqrt{2}cos(z)
Интервал распределения:
https://www.cyberforum.ru/cgi-bin/latex.cgi?(0\leq z\leq \pi /4)
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
21.09.2013, 18:54
Ответы с готовыми решениями:

Генерирование случайного числа для типа ulong
Мне необходимо сгенерировать случайное число для типа ulong. Для решения этой задачи напрашивается самый простой вариант. ...

Построить массив в котором числа следуют по заданному закону
2. Задан числовой массив А. Составить программу построения одномерного массива, в котором следуют числа по следующему закону: >-10 и...

Заполнить матрицу по заданному закону
Задание: Найти закон по которому формируется указанная матрица. Разработать алгоритм и по нему составить программу для ...

8
Эксперт функциональных языков программированияЭксперт по математике/физике
4313 / 2105 / 431
Регистрация: 19.07.2009
Сообщений: 3,204
Записей в блоге: 24
22.09.2013, 00:03
Нарисуйте график и кидайте случайным образом точки в площадку под графиком. Ордината точки будет иметь нужный закон распределения.

Подробнее:
https://www.cyberforum.ru/cgi-bin/latex.cgi?s(z) = \int_0^z f(z)dz
Собственно, https://www.cyberforum.ru/cgi-bin/latex.cgi?0 < s(z) < s(z_{max})
Если случайно кинуть точку r из 0..s(zmax), то https://www.cyberforum.ru/cgi-bin/latex.cgi?s(z)=r и https://www.cyberforum.ru/cgi-bin/latex.cgi?z=s^{-1}(r)
Всё! Только требуется, чтоб f(z)>0 при всех z.

Можно убедиться, что такая точка z=s^{-1}(r) действительно имеет плотность s'(z)=f(z).
1
 Аватар для VladSharikov
25 / 25 / 7
Регистрация: 02.12.2010
Сообщений: 824
22.09.2013, 04:18  [ТС]
Гм. Для начала практический смысл : случайных чисел будет больше тех, где будет больше значение функции распределения вероятностей?
Например в моей функции плотности распределения так : около 0 будет много св, ближе к pi/4 колво св должно быть меньше.

Так?
0
1967 / 823 / 114
Регистрация: 01.10.2012
Сообщений: 4,847
Записей в блоге: 2
22.09.2013, 07:59
Цитата Сообщение от Mysterious Light Посмотреть сообщение
Нарисуйте график и кидайте случайным образом точки в площадку под графиком. Ордината точки будет иметь нужный закон распределения.
Всего неск дней назад делал эту задачу. Причем да, даю пользователю именно график. Вот только дальше я Вас не очень понял - что значит "кидайте"? Выбросили случайное "белое" значение от 0 до 1 (пусть z = 1 для простоты) и что? Где результат?

Я делал так: представил график в виде гистограммы (200 столбцов), высота каждого берется из графика. Получил ряд значений (x, y), напр

(0, 0.9) (1, 0.8) (2, 0.75)...

Заменил x на накопленный y
(0, 0.9) (0.9, 0.8)(1.7, 0.75) ...

Теперь выбрасываю случайное число, умножаю его на сумму всех y (по сути нормирую) и нахожу поиском куда (в какой элемент массива) оно попало по х и беру y. Напр после умножения число 1.2, значит результат 0.8 или, более точно интерполировать между 0.8 и 0.85 (ну мне большая точность была не нужна)

Я понял все что Вы написали, кроме реализации. Если можно как-то проще/элегантнее - поясните как
0
Эксперт функциональных языков программированияЭксперт по математике/физике
4313 / 2105 / 431
Регистрация: 19.07.2009
Сообщений: 3,204
Записей в блоге: 24
22.09.2013, 13:25
Igor3D, Вы хорошо объяснили вариант этого алгоритма, хотя и работаете в конечном приближении.

На всякий случай ещё раз проговорю теорию с картинкой.


Окружим точки 0.2 и 0.6 окрестностями равной длины (на рисунке это 0.02) и зададимся вопросом, в какую СВ попадёт чаще. Очевидно, что в 0.2, потому что f(0.2)>f(0.6). При этом f(z) пропорционально площадке под кривой f в малой окрестности z фиксированной ширины (на рис. пунктир показывает, что слева над ним находится избыточная площадь по сравн. с площадью справа).

Напрашивается утверждение: если мы будем в эту площадь закрашенной фигуры кидать точку равномерно по площади, то её абсцисса (вот здесь я ошибся! абсцисса — это z, он нас интересует, а не ордината) будет удовлетворять закону f(z). Под равномерностю понимается то, что в любые фигуры равной площади имеется равный шанс попасть.

Этого можно достичь, например, разбив всю площадь на квадратики равного размера и случайно выбрав один из них. По сути, Igor3D делает то же самое, когда берёт число от 0 до суммы всех y, у него «накопленный y» играет роль номера квадратика, нумерация по горизонтали слева направо, по вертикали не важно как.
В пределе малых квадратиков (что является более точным методом) речь идёт о настоящий площадях, а не о приближениях, поэтому появляется интеграл функции с верхним переменным пределом — аналог «накопленного y», но непрерывный.

Вернёмся к утверждению. Его доказательство на уровне «квадратиков» тривиально: чем больше f(z), тем больше квадратиков в столбце, тем больше вероятность выбрать один из них. В предельном случае это утверждение является следствием теоремы
https://www.cyberforum.ru/cgi-bin/latex.cgi?\frac{\rm d}{\rm{d}w}\int_0^w f(z)\rm{d}z = f(w)

Далее у меня была чистая математика. Я говорил, что если s(z) имеет равномерное распределение r, то https://www.cyberforum.ru/cgi-bin/latex.cgi?z=s^{-1}(r).

Существенно отличие последнего подхода от предложенного Igor3D заключается в то, что предельный переход в него уже вложен. Если Igor3D вынужден для повышения точности либо неким образом аппроксимировать результат, либо уменшать дискретизацию, то в моём методе (хотя он не мой! просто сейчас его здесь отстаиваю я) формула может быть выведена точно, аналитически.
Мы знаем аналитический вид f(z), мы можем проинтегрировать и получить
https://www.cyberforum.ru/cgi-bin/latex.cgi?s(w) = \int_0^w f(z)\rm{d}z = \sqrt{2} \sin w
Заметим, что https://www.cyberforum.ru/cgi-bin/latex.cgi?0<s<1. затем можем явно найти обратную функцию:
https://www.cyberforum.ru/cgi-bin/latex.cgi?s^{-1}(r) \;=\; \arcsin\,\frac{r}{\sqrt2}
JavaScript
1
function randf() { return Math.asin( Math.random() / Math.sqrt{2} ); }
Ниже приведена гистограмма значений 1 000 000 случайный чисел по этой формуле.
1
1967 / 823 / 114
Регистрация: 01.10.2012
Сообщений: 4,847
Записей в блоге: 2
22.09.2013, 14:41
Цитата Сообщение от Mysterious Light Посмотреть сообщение
то в моём методе (хотя он не мой! просто сейчас его здесь отстаиваю я) формула может быть выведена точно, аналитически.
Ну как минимум надо иметь аналитическую ф-цию на входе. У меня пользователь задает размеры пузырьков, естественное желание "очень много маленьких и совсем чуть-чуть больших". Но сколько это "много" - никто не знает, включая самого пользователя. Ему надо попробовать/прикинуть. Заряжаю ему график, можно удалять/вставлять точки, менять сглаживание.

Конечно аналитика - дело хорошее, но ее уязвимое место - отсутствие гибкости (а может и общности)
Изображения
 
0
Эксперт функциональных языков программированияЭксперт по математике/физике
4313 / 2105 / 431
Регистрация: 19.07.2009
Сообщений: 3,204
Записей в блоге: 24
22.09.2013, 14:56
Igor3D, Вы правы. Точнее сказать, есть свои плюсы и минусы в каждом из этих методом и они должны использоваться в разных местах.

Если кратко (но Вы же это и без меня знаете?)
1. Аппроксимация позволяет не знать заранее функцию распр. или работать с монстрами.
2. Она допускает менять функцию на ходу.
3. Аналитическое решение более точное. По крайней мере, точность ограничивается машинной или ещё чем-то, но не шагом.
4. Оно быстрее. Сравните функцию ТС: мой код предлагает 3 действия для получения результата, Ваша — по числу ячеек.
Итак, когда Вашу функцию использовать — Вы описали, а аналитеческое решение — когда функция распр. заведомо известна и нужно за наименшее время нагенерировать много чисел.
0
1967 / 823 / 114
Регистрация: 01.10.2012
Сообщений: 4,847
Записей в блоге: 2
22.09.2013, 15:36
Цитата Сообщение от Mysterious Light Посмотреть сообщение
Точнее сказать, есть свои плюсы и минусы в каждом из этих методом и они должны использоваться в разных местах.
Конечно, тут спорить не о чем

Цитата Сообщение от Mysterious Light Посмотреть сообщение
4. Оно быстрее. Сравните функцию ТС: мой код предлагает 3 действия для получения результата, Ваша — по числу ячеек.
Ой нет, здесь все наоборот Двоичный спуск - это 5-6 простых сравнений, я брал 200 ячеек. Ну ладно пусть 20 (для миллиона) - все равно это несоразмеримо с внутренностями sqrt и asin. Железячники (напр OpenGL) часто именно так и ускоряются - заменяют ф-цию таблицей.

Другое дело куда приятнее записать строчку формулы чем городить массив и.т.д - совсем не 1 десяток строк. Ну что поделать если аналитики нет
1
Эксперт функциональных языков программированияЭксперт по математике/физике
4313 / 2105 / 431
Регистрация: 19.07.2009
Сообщений: 3,204
Записей в блоге: 24
22.09.2013, 15:37
Цитата Сообщение от Igor3D Посмотреть сообщение
Двоичный спуск - это 5-6 простых сравнений, я брал 200 ячеек. Ну ладно пусть 20 (для миллиона) - все равно это несоразмеримо с внутренностями sqrt и asin. Железячники (напр OpenGL) часто именно так и ускоряются - заменяют ф-цию таблицей
Я об этом как-то забыл
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
22.09.2013, 15:37
Помогаю со студенческими работами здесь

Генерация случайного числа, максимально случайного
Добрый день, задался вопросом как получить случайное число, но не псевдо-случайное по идее функции rand() и srand(time(NULL))...

Построение графика по заданному математическому закону
я только недавно изучаю С++, на работе поставили задачу реализовать построение графика по заданному математическому закону: An = An-1 +...

Синтез механизма по заданному закону движения выходного звена
Синтезировать два стержневых механизма, законы выходного звена на рис. OX от 0 до 1 это множитель угла 360. Например 0.6 это...

Моделирование генеральной совокупности случайной величины по заданному закону распределения
1. Составить программу, которая позволяет производить генерацию генеральной совокупности случайной величины в соответствии с заданным...

Проверить, удовлетворяют ли элементы списка (базовый тип integer) заданному закону
Нужно решить задачу с использованием технического списка. Проверить, удовлетворяют ли элементы списка (базовый тип integer) закону x=f(x0,...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Подключение Box2D v3 к SDL3 для Android: физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru