Как рассчитать весовые вероятности перестановки в питоне - PullRequest
0 голосов
/ 21 октября 2019

У меня есть строка чисел 0-12 с весами, связанными с ними. Массив весов выглядит следующим образом: [150000, 150000, 50, 150000, 150000, 800, 130000, 130000, 25000, 100000, 100000, 100000].

Я смоделировал все комбинации чисел 0-12 в Python, но я хочу написать некоторый дополнительный код для имитации вероятностей выбора конкретной комбинации без замены. Например, вероятность выбора (1,2,5,3) должна быть (150000/total weight)*(150000/total weight-150000)*(150000/total weight-150000-150000)*(50/total weight-150000-150000-150000-50)

. Я понятия не имею, как это кодировать из-за части «без замены», я думаю об использованиицикл for, который просматривает конкретное число в позиции в перестановке и определяет вероятность выбора этого числа в этой позиции, но я надеюсь, что есть способ посмотреть каждую отдельную перестановку.

1 Ответ

0 голосов
/ 21 октября 2019

Я не знаю, почему у вас есть строка чисел, но вот рабочий пример списка целых чисел, который, на мой взгляд, имеет больше смысла:

import random

weights =  [150000, 150000, 50, 150000, 150000, 800, 130000, 130000, 25000, 100000, 100000, 100000, 10000]
total_weight = sum(weights)
l = list(range(13))

tmp_weight = 0
new_weight = 1
for i in range(5):
    number = random.choice(l)
    print(number)
    new_weight *= weights[number]/(total_weight-tmp_weight)
    tmp_weight += weights[number]
    l.remove(number)

print(new_weight)

Я не уверен, что логикакак вы хотите, потому что ваш пример не был понятен.

Вы можете создавать кортежи с (числом, весом), а также. Но сначала вы должны уточнить свой вопрос.

Редактировать после комментария: для определенного порядка чисел он должен работать следующим образом

perm = [1,2,3,4]
weights =  [150000, 150000, 50, 150000, 150000, 800, 130000, 130000, 25000, 100000, 100000, 100000, 10000]
total_weight = sum(weights)

tmp_weight = 0
new_weight = 1
for number in perm:
    new_weight *= weights[number]/(total_weight-tmp_weight)
    tmp_weight += weights[number]

print(new_weight)
...