0 / 0 / 0
Регистрация: 15.01.2019
Сообщений: 4
1

Выбор случайного числа из ряда чисел в зависимости от показательной функции

15.01.2019, 13:54. Показов 863. Ответов 9
Метки нет (Все метки)

Подскажите плиз, может есть известное решение..

Есть массив натуральных чисел, пусть будет 1-100.
Из этого ряда надо выбрать число случайным образом, и чем меньше вес числа, тем чаще оно должно выпадать (по графику показательной функции)

Т.е. 5 должно выпадать заметно чаще , чем 95.
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.01.2019, 13:54
Ответы с готовыми решениями:

Выбор случайного числа
Столкнулась с проблемой, о которой раньше как-то не задумывалась... Предположим, у меня есть 3...

Выбор случайного числа
День добрый! Нужна помощь. Есть БД, в ней картинки записи и т.д. У каждой записи есть свой id....

Выбор случайного числа из заданного массива
Добрый день! можете подсказать ,как написать чтобы выбиралось из заданного массива ,пример массива...

Записать выражение для ряда распределения случайного числа агрегатов
Добрый вечер. Испытываются независимо N агрегатов на надежность. Вероятность не выдержать...

9
Модератор
2959 / 2098 / 450
Регистрация: 26.03.2015
Сообщений: 8,148
15.01.2019, 16:07 2
Есть сто 100 чисел. У каждого свой вес. Вероятность pi выпадения некого числа равна вес wi делить на сумму всех весов W.
pi = wi/W

Генерируем случайное число P от 0 до 1. Находим такое i, что сумма весов w0...wi-1 меньше p, но больше или равна p - wi

Для определения номера "выпавшего" числа можно суммировать веса элементов массива, пока эта сумма не превысит наше случайное число, умноженное на сумму всех весов.
1
43 / 31 / 3
Регистрация: 27.03.2016
Сообщений: 116
16.01.2019, 09:44 3
Да собственно можно всё предельно просто сделать.
Цитата Сообщение от TwilightCruiser Посмотреть сообщение
1-100
Это твои Х
Цитата Сообщение от TwilightCruiser Посмотреть сообщение
по графику показательной функции
Например, У=100000*0,9^Х. (сто тыщ взял просто для наглядности, можно без него, а 0,9 взял наобум - цифры выбери сам под свою задачу)
Ты берёшь настоящее случайное число У от 94868 (при х=0,5) до 2,65614 (при х=100,5) - это будет твоим У
После этого обратным счётом находишь Х и округляешь его до натурального, которое и будет твоим не совсем случайным Х.
Х=1 будет встречаться намного чаще, чем 100.

Только надо подумать над граничными условиями. Я взял интуитивно 0,5 и 100,5, но для идеальной картины могут понадобится чуть другие цифры.
0
921 / 1408 / 167
Регистрация: 07.05.2013
Сообщений: 3,119
Записей в блоге: 12
16.01.2019, 17:27 4
массив из которого нужно делать выборку по ГСЧ может выглядеть так:

{ 100, 99, 99. 98. 98. 98. 97, 97, 97, 97 ... }

ps: пример из практики, у меня так организован дроп в игре
0
0 / 0 / 0
Регистрация: 15.01.2019
Сообщений: 4
16.01.2019, 18:48  [ТС] 5
Цитата Сообщение от vantfiles Посмотреть сообщение
массив из которого нужно делать выборку по ГСЧ может выглядеть так:
{ 100, 99, 99. 98. 98. 98. 97, 97, 97, 97 ... }
Думал о таком варианте, но всё равно этот массив надо как-то заполнить.
Он не будет постоянным, это будут целые числа от 1 до 99 с каким-то шагом, иногда может меняться количество элементов и шаг.
0
0 / 0 / 0
Регистрация: 15.01.2019
Сообщений: 4
16.01.2019, 18:56  [ТС] 6
Сделал тестовый пример себе
Как я понял код получается примерно такой

Python
1
2
3
4
5
6
7
8
9
10
11
12
array_0_100 = GetArray() # генерация массива от 1 до 100 с шагом 1
sigma = GetSumOfArray(array_0_100) # сумма всех элементов массива
 
rand = GetRandom() # случайное число в диапазоне 0..1
 
lambda = sigma * rand
 
accu = 0
for cell in array_0_100:
    accu = accu + cell
    if accu >= lambda:  # если условие сработало, нашли нужный элемент массива
        return cell
Прогнал 10000 раз что бы набрать статистику, и работает как-то не так, как я ожидал
Зеленым это переменная rand
Красным cell
Миниатюры
Выбор случайного числа из ряда чисел в зависимости от показательной функции  
0
43 / 31 / 3
Регистрация: 27.03.2016
Сообщений: 116
16.01.2019, 20:25 7
Цитата Сообщение от TwilightCruiser Посмотреть сообщение
и работает как-то не так, как я ожидал
Может и так (без вертикальной оси тяжело оценить, а код я не понял). Просто 10000 мало. Увеличь раз в 100. Или хотя бы попробуй построить график пятёрками: сколько раз выпало от 0 до 5, сколько раз от 6 до 10 и так далее.
0
1470 / 825 / 140
Регистрация: 12.10.2013
Сообщений: 5,456
16.01.2019, 23:08 8
есть 5 чисел 11,42,73,34,54
Rnd=случайное от 0 до 1
находим какому диапазону принадлежит RndDiap=(кол-во диапазонов)*Rnd
RndDiap=5*Rnd

если RndDiap от 0 до 1 то вернуть 11
если RndDiap от 1 до 2 то вернуть 42
...
Так размер каждого диапазона одинаковый.


Поменяем одному размер диапазона.
Всем диапазонам вес Wn=1
Диапазону 3 зададим W3=10
складываем все веса SumWn=1+1+10+1+1
RndDiap=SumWn*Rnd
если RndDiap от 0 до 1 то вернуть 11
если RndDiap от 1 до 2 то вернуть 42
если RndDiap от 2 до 10 то вернуть 73
если RndDiap от 12 до 13 то вернуть 34
если RndDiap от 13 до 14 то вернуть 54
...
Теперь намного чаще попадаем в диапазон 3.

Проверять так:
генерируем 1000 рандом чисел в массив.
строим график:
по OX номера 11,42,73,34,54
по OY количество повторов чисел, больше повторов числа выше Y.

Добавлено через 24 минуты
Цитата Сообщение от vantfiles Посмотреть сообщение
из которого нужно делать выборку по ГСЧ
Самый простой и быстрый вариант.

Генерируем нужно кол-во повторов, собираем в 1 массив, может перетасовать.
Читать просто как двери…округлить до ближайшего целого (количество элементов в массиве)*rand.
1
0 / 0 / 0
Регистрация: 15.01.2019
Сообщений: 4
23.01.2019, 16:52  [ТС] 9
Всем спасибо, получились оба варианта, и выборкой из массива и сложением весов. Работает как надо. Мой фрагмент кода выше правильный, у меня что-то не так было с формулой вычисления веса чисел по обратной экспоненциальной зависимости.
0
1470 / 825 / 140
Регистрация: 12.10.2013
Сообщений: 5,456
23.01.2019, 22:41 10
В разных алгоритмах реализации ГПСЧ могут быть нелинейности вероятности выбора числа. Этим можно воспользоваться задав дипазон ближе к пику такого графика.
В гугле хотел посмотреть эти графики и набрал “Распределение ГПСЧ вероятности”

какраз ваша задачка =)).
Включите “картинки” много интересного выпадает
“превращать равномерный ГСЧ в генератор случайных чисел с заданным произвольным законом распределения”
http://stratum.ac.ru/education... ion24.html
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.01.2019, 22:41
Помогаю со студенческими работами здесь

Как сделать выбор кол-ва (1,2,3,4), и выведение числа в зависимости от значения этого числа
Как сделать вот выбор кол-ва как на скрине. Вложил скрин ниже.

Очередь целых чисел, генератор случайного числа, и задача
Помогите, пожалуйста, с задачей! Для тех, кто в этом хорошо разбирается, я уверен, что эта задача...

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

Выбор пространства имен в зависимости от аргумента функции
Здравствуйте! В рамках знакомства с SDL2 я создаю пробный проект. Одним из ключевых моментов...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru