У меня есть два числа 1,2 с вероятностями .7 и, соответственно 3. Как я могу забрать один номер в соответствии с заданными вероятностями ..Как подобрать число из массива с заданными вероятностями
ответ
прямой реализации
Что вам нужно, это уменьшенная Бернулли генератор случайных чисел. Оригинальный Бернулли случайная величина 0 или 1, и вам нужно 1 или 2. Таким образом, следующий код должен работать:
a = binornd(1,0.3)+1;
первый аргумент размер (здесь 1 см MATLAB документации), то второй из них является вероятность получения 1. При добавлении 1 это становится вероятностью получения 2.
ВНИМАНИЕ: Остальная часть ответа не рекомендуется для людей без юмора.
Реализация Geeky
Вы можете использовать единообразный генератор случайных чисел и настроить его:
a = rand; %in (0,1) range
result = 1*(a<=0.7) + 2*(a>0.7);
уборщицу пути (спасибо Luis Mendo):
result = 1 + (rand>.7);
Реализация Über-Geeky
Предполагая некоторую цифру дробной части в tic...toc
равномерно случайным образом:
tic
A = rand(12060, 4400);
B = rand(12000, 4430);
t=toc;
t=round(t*10^3);
t = mod(t, 10);
randVal = (t<=6)*1 + (t>6)*2;
Расширенная Убер-Geeky Реализация
Расширение предыдущего подхода, но на этот раз с использованием псевдо-случайным образом 32 (каждый бит генерируется как в предыдущем методе), деля его на максимальное значение, таким образом получая приблизительно равномерно распределенную переменную между 0 и 1.
randNum = 0;
for i=0:31
tic
A = rand(12000, 4400);
B = rand(12000, 4400);
t=toc;
t=round(t*10^3);
randNum = randNum + mod(t,2)*2^i;
end
%randNum is a uniformly distributed number between 0 and 2^32 - 1
randNum = randNum/(2^32);
final = (randNum<=0.7)*1 + (randNum>0.7)*2;
Чистая необработанная сырость. +1. – rayryeng
Обычно я не отвечаю на самые плохие вопросы, но я не мог пройти, хорошую работу. – runDOSrun
@runDOSrun - Я обычно тоже этого не делаю, но если ответ действительно хороший, и если человек, который написал ответ, показал много усилий, а также разъяснил некоторые запутанные части вопроса, они, безусловно, получили мое преимущество. – rayryeng
Основная проблема выбора числа с определенным распределением довольно распространена. Ваш пример - очень простая форма, хотя название вопроса подразумевает, что вас интересует общее решение.
Вот простая функция, которая работает, выбирая случайное число от 0 до 1. Затем оно перебирает значения в массиве распределения, аккумулируя их из cdf дистрибутива. Когда значение в аккумуляторе превышает случайное значение, возвращается индекс.
function idx = randWithDist(dist)
r = rand;
a = 0;
idx = 0;
while(r > a)
idx = idx + 1;
a = a + dist(idx);
end
end
Это избыточно для вашего примера 2-значения, но вы бы использовать его как это: randWithDist([.7 .3])
Если вы используете эту функцию, чтобы выбрать значения из произвольного массива (например, ваш вопрос подразумевает), просто использовать возвращаемое значение как индекс в массив:
dist = [.2 .3 .4 .1];
val = [1 2 10 11];
samples = [];
for i=1:10000
samples = [samples val(randWithDist(dist))];
end
histogram(samples);
Это должно выбрать 1 с .2 вероятностью, 2 с .3, 10 с.4 и 11 с .1. График гистограммы показывает, что он работает правильно.
Другой твик я бы к нему для того, чтобы она могла обрабатывать более общие входы изменяет первую строку r = rand * sum(dist)
. Это автоматически нормализует распределение, поэтому его не нужно суммировать до 1.
- 1. Случайное число с вероятностями
- 2. Рисование символов с заданными вероятностями в Perl
- 3. Генерация случайных целых чисел с заданными вероятностями
- 4. C++, как случайным образом с заданными вероятностями выбирают числа
- 5. Случайные массивы бит с заданными вероятностями с numpy
- 6. эффективно выбрать случайные индексы матрицы с заданными вероятностями
- 7. Вычисления ковариационной матрицы в MATLAB с заданными вероятностями
- 8. Случайный выбор из списка с взвешенными вероятностями
- 9. Перебор массива с заданными интервалами
- 10. Соответствующее число с заранее заданными шаблонами
- 11. Как сгенерировать случайный int из массива с заданными элементами?
- 12. Случайные ints с разными вероятностями
- 13. создание матрицы с вероятностями
- 14. случайная карточка из колоды с вероятностями
- 15. scala: как подобрать случай по длине массива
- 16. Как инициализировать число из массива
- 17. Вычесть число из массива
- 18. Создание 2D-массива с заданными размерами (простой)
- 19. Получение массива значений хэша с заданными ключами
- 20. случайное число из массива
- 21. Наименьшее число из массива
- 22. Как представить число с заданными числами, используя арифметические операции?
- 23. Java - возвращает массив из массива с двумя заданными индексами
- 24. python: случайный образец с вероятностями
- 25. Merge массива с заданными значениями в один из ключевых
- 26. Случайное число из массива
- 27. Python: создание массива из списка с заданными индексами
- 28. Как сопоставить таблицу с различными вероятностями данных?
- 29. Генерация случайного графа с вероятностями
- 30. Генерировать случайное число между заданными значениями Java
Что вы пробовали до сих пор? У вас есть какая-то конкретная проблема? Кроме того, вы должны искать «распространение Бернулли» в Википедии, это должно помочь вам. – Yellows
Я пробовал, но не добился успеха .. как я могу использовать процесс bernoulli, чтобы забрать номер. – mohamed