Как я моделирую смещенный, умирают в Python?

Я хочу моделировать смещенный N-sided, умирают?

def roll(N,bias):
     '''this function rolls N dimensional die with biasing provided'''
     # do something
     return result

>> N=6
>> bias=( 0.20,0.20,0.15,0.15,0.14,0.16,)
>> roll(N,bias)
   2
9
задан Sandipan Dey 11 September 2019 в 08:53
поделиться

4 ответа

Определенная математика здесь.

Постоянный клиент умирает, даст каждый номер 1-6 с равной вероятностью, а именно, 1/6. Это упоминается как равномерное распределение (дискретная версия его, в противоположность непрерывной версии). Значение этого, если X случайная переменная, описывающая результат единственной роли затем X~U[1,6] - значение X распределяется одинаково против всех возможных результатов броска кости, 1 - 6.

Это равно выбору числа в [0,1) при делении его на 6 разделов: [0,1/6), [1/6,2/6), [2/6,3/6), [3/6,4/6), [4/6,5/6), [5/6,1).

Вы запрашиваете другое распределение, которое смещается. Самый легкий способ достигнуть этого состоит в том, чтобы разделить раздел [0,1) к 6 частям в зависимости от предвзятости Вы хотите. Таким образом в Вашем случае Вы хотели бы разделить его на следующее: [0,0.2), [0.2,0.4), [0.4,0.55), 0.55,0.7), [0.7,0.84), [0.84,1).

Если Вы будете смотреть на статью в Википедии, то Вы будете видеть, что в этом случае, функция интегральной вероятности не будет состоять из 6 частей равной длины, а скорее из 6 частей, которые отличаются по длине согласно предвзятости, которую Вы дали им. То же идет для массового распределения.

Назад к вопросу, в зависимости от языка Вы используете, просто переводите этот назад в Ваш бросок кости. В Python вот очень поверхностное, хотя работая, пример:

import random
sampleMassDist = (0.2, 0.1, 0.15, 0.15, 0.25, 0.15)

# assume sum of bias is 1
def roll(massDist):
    randRoll = random.random() # in [0,1)
    sum = 0
    result = 1
    for mass in massDist:
        sum += mass
        if randRoll < sum:
            return result
        result+=1

print roll(sampleMassDist)
26
ответ дан 4 December 2019 в 06:05
поделиться
import random

def roll(sides, bias_list):
    assert len(bias_list) == sides
    number = random.uniform(0, sum(bias_list))
    current = 0
    for i, bias in enumerate(bias_list):
        current += bias
        if number <= current:
            return i + 1

Предвзятость будет пропорциональна.

>>> print roll(6, (0.20, 0.20, 0.15, 0.15, 0.14, 0.16))
6
>>> print roll(6, (0.20, 0.20, 0.15, 0.15, 0.14, 0.16))
2

Мог использовать целые числа слишком (лучше):

>>> print roll(6, (10, 1, 1, 1, 1, 1))
5
>>> print roll(6, (10, 1, 1, 1, 1, 1))
1
>>> print roll(6, (10, 1, 1, 1, 1, 1))
1
>>> print roll(6, (10, 5, 5, 10, 4, 8))
2
>>> print roll(6, (1,) * 6)
4
6
ответ дан 4 December 2019 в 06:05
поделиться

Больше агностика языка, но Вы могли использовать справочную таблицу.

Используйте случайное число в диапазоне 0-1 и поиске значение в таблице:

0.00 - 0.20   1
0.20 - 0.40   2
0.40 - 0.55   3
0.55 - 0.70   4
0.70 - 0.84   5
0.84 - 1.00   6
11
ответ дан 4 December 2019 в 06:05
поделиться

См. рецепт для метода псевдонима Walker's для случайных объектов с различными вероятностями.
Пример, представляет в виде строки B C или D с вероятностями.1.2.3.4-

abcd = dict( A=1, D=4, C=3, B=2 )
  # keys can be any immutables: 2d points, colors, atoms ...
wrand = Walkerrandom( abcd.values(), abcd.keys() )
wrand.random()  # each call -> "A" "B" "C" or "D"
                # fast: 1 randint(), 1 uniform(), table lookup

удачи
- denis

1
ответ дан 4 December 2019 в 06:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: