взвешенный случайный только для одного значения

Следующая строка возвращает пару координат

coordinates = random.random()*640.0, random.random()*480.0

Как получить конкретную пару координат например (100.0, 100.0) с вероятностью 0.03. Координаты генерируются в цикле, количество циклов при каждом запуске разное, но максимальное количество циклов равно 1000.

Я не уверен, что это такое. Google говорит, что это взвешенный случайный выбор. Но все примеры содержат список вероятностей, у меня только одно конкретное значение с заданной вероятностью.

РЕДАКТИРОВАТЬ: Извините, ребята, это равномерная выборка и поплавки.


person Olga    schedule 23.05.2014    source источник
comment
Понятно, что вы хотите, чтобы произошло в 3% случаев. Непонятно, что вы хотите, чтобы произошло в оставшихся 97% случаев. Не могли бы вы уточнить это?   -  person NPE    schedule 23.05.2014


Ответы (3)


Я бы решил проблему в два этапа:

Шаг 1) Сделайте так, чтобы (100 100) выпадало в 3% случаев. Бросьте случайное значение от 0 до 1. Если значение меньше 0,03, верните (100, 100), в противном случае перейдите к шагу 2.

Шаг 2) Обработайте другой случай 97%. Верните случайную координату между любыми значениями, которые вы хотите, как вы уже это делаете. Не совсем понятно, что вы хотите здесь сделать. Основываясь на вашем примере, я предполагаю, что вы хотите выбрать равномерно распределенное значение между (0,0) и (640 480).

Вероятность того, что вы получите (100, 100) на шаге 2, крайне мала. Если очень важно, чтобы вероятность получения (100, 100) была ровно 3%, а не чуть больше 3%, тогда проверьте (100,100 ) на шаге 2 и перебросьте кубик, если выпадет случайно. Это невероятно маловероятно, если вы генерируете плавающие координаты, что вы можете просто пропустить эту проверку.

Если ваши координаты являются только целыми числами, то случайное получение (100, 100) по-прежнему маловероятно, но это все же может произойти. См. ответ pjs

person Pete Baughman    schedule 23.05.2014
comment
это равномерное распределение (непрерывное) для остальных рандомов. И я генерирую поплавки. - person Olga; 24.05.2014
comment
Тогда это правильный путь решения этой проблемы, и вы должны его принять. - person pjs; 25.05.2014

В дальнейшем я предполагаю, что вы хотите, чтобы вероятность 97% была равномерно распределена по 640*480 - 1 целочисленным координатам, отличным от (100, 100).

Мое предложение похоже на предложение Пита, но с точными вероятностями (установленными Fraction), заданными так, что на втором этапе обозначенная координата (100, 100) не является частным случаем. Во-первых, давайте выясним, какие точные вероятности необходимы:

>>> from fractions import Fraction
>>> p = Fraction(97, 100) / (640 * 480 - 1)
>>> p
Fraction(1, 316700)
>>> remainder = 1 - (640 * 480 * p)
>>> remainder
Fraction(95, 3167)

У нас есть 97/100 вероятности, распределенной по неуказанным координатам, поэтому каждая должна произойти с вероятностью 1 / 316700. Давайте также поместим эту большую вероятность в обозначенную координату. В этом случае оставшаяся вероятность в (100, 100) рассчитывается как remainder. Алгоритм становится таким:

if random.random() <= remainder:
   coordinates = 100, 100
else:
   coordinates = random.randint(0, 639), random.randint(0, 479)

Если вы действительно хотели, чтобы результаты были непрерывными, за исключением всплеска вероятности в (100, 100), то ответ Пита — правильный путь.

person pjs    schedule 23.05.2014

Одним из способов было бы создать список с 0,03 * N записей (100 100) и 0,97 * N случайных записей, а затем случайным образом изменить порядок этого списка ... Однако для больших N ответ @PeteBaughman, вероятно, лучше ...

person twalberg    schedule 23.05.2014
comment
На самом деле это может быть лучше или хуже, в зависимости от конкретных требований. Для N = 1000 этот метод гарантирует, что вы получите (100 100) ровно 30 раз. Если бы вы выбирали координаты случайным образом и ожидали, что (100 100) будет иметь вероятность 0,03, то вы могли бы получить (100 100) 29, 31 или 28 и т. д. раз на каждые 1000 выборов. - person Pete Baughman; 23.05.2014