|
25 / 25 / 7
Регистрация: 02.12.2010
Сообщений: 824
|
|
Генерирование случайного числа по заданному закону21.09.2013, 18:54. Показов 1718. Ответов 8
Метки нет (Все метки)
Построить программный генератор случайных чисел с заданным законом распределения. Рекомендуется использовать метод обратных функций.
Это задача. Как построить такое генератор? Понятно есть разные функции rand() и т.п. в разных языках, но как привязать это к закону распределения? Плотность распределения вероятностей: Интервал распределения:
0
|
|
| 21.09.2013, 18:54 | |
|
Ответы с готовыми решениями:
8
Генерирование случайного числа для типа ulong
Заполнить матрицу по заданному закону |
|
|
|
| 22.09.2013, 00:03 | |
|
Нарисуйте график и кидайте случайным образом точки в площадку под графиком. Ордината точки будет иметь нужный закон распределения.
Подробнее: Собственно, Если случайно кинуть точку r из 0..s(zmax), то Всё! Только требуется, чтоб f(z)>0 при всех z. Можно убедиться, что такая точка z=s^{-1}(r) действительно имеет плотность s'(z)=f(z).
1
|
|
|
25 / 25 / 7
Регистрация: 02.12.2010
Сообщений: 824
|
|
| 22.09.2013, 04:18 [ТС] | |
|
Гм. Для начала практический смысл : случайных чисел будет больше тех, где будет больше значение функции распределения вероятностей?
Например в моей функции плотности распределения так : около 0 будет много св, ближе к pi/4 колво св должно быть меньше. Так?
0
|
|
| 22.09.2013, 07:59 | ||
|
Я делал так: представил график в виде гистограммы (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
|
||
|
|
||||||
| 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), тем больше квадратиков в столбце, тем больше вероятность выбрать один из них. В предельном случае это утверждение является следствием теоремы Далее у меня была чистая математика. Я говорил, что если s(z) имеет равномерное распределение r, то Существенно отличие последнего подхода от предложенного Igor3D заключается в то, что предельный переход в него уже вложен. Если Igor3D вынужден для повышения точности либо неким образом аппроксимировать результат, либо уменшать дискретизацию, то в моём методе (хотя он не мой! просто сейчас его здесь отстаиваю я) формула может быть выведена точно, аналитически. Мы знаем аналитический вид f(z), мы можем проинтегрировать и получить
1
|
||||||
| 22.09.2013, 14:41 | ||
|
Конечно аналитика - дело хорошее, но ее уязвимое место - отсутствие гибкости (а может и общности)
0
|
||
|
|
|
| 22.09.2013, 14:56 | |
|
Igor3D, Вы правы. Точнее сказать, есть свои плюсы и минусы в каждом из этих методом и они должны использоваться в разных местах.
Если кратко (но Вы же это и без меня знаете?) 1. Аппроксимация позволяет не знать заранее функцию распр. или работать с монстрами. 2. Она допускает менять функцию на ходу. 3. Аналитическое решение более точное. По крайней мере, точность ограничивается машинной или ещё чем-то, но не шагом. 4. Оно быстрее. Сравните функцию ТС: мой код предлагает 3 действия для получения результата, Ваша — по числу ячеек. Итак, когда Вашу функцию использовать — Вы описали, а аналитеческое решение — когда функция распр. заведомо известна и нужно за наименшее время нагенерировать много чисел.
0
|
|
| 22.09.2013, 15:36 | |||
Двоичный спуск - это 5-6 простых сравнений, я брал 200 ячеек. Ну ладно пусть 20 (для миллиона) - все равно это несоразмеримо с внутренностями sqrt и asin. Железячники (напр OpenGL) часто именно так и ускоряются - заменяют ф-цию таблицей.Другое дело куда приятнее записать строчку формулы чем городить массив и.т.д - совсем не 1 десяток строк. Ну что поделать если аналитики нет
1
|
|||
|
|
|
| 22.09.2013, 15:37 | |
|
0
|
|
| 22.09.2013, 15:37 | |
|
Помогаю со студенческими работами здесь
9
Генерация случайного числа, максимально случайного Построение графика по заданному математическому закону Синтез механизма по заданному закону движения выходного звена Моделирование генеральной совокупности случайной величины по заданному закону распределения Проверить, удовлетворяют ли элементы списка (базовый тип integer) заданному закону Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Подключение 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 и т. д.
Сборка примера
Скачайте. . .
|