Видите, это не так сложно сделать, если вы создаете словарь значений.
То, что я хочу сказать, в вашем понимании списка, просто создайте словарь для каждой комбинации, поместив все имена под ключом с именем «name», а адреса как значения ключа с именем address.
Тогда просто сделайте это:
pd.DataFrame([name,address])
Это должно сработать.
Определенная математика здесь.
Постоянный клиент умирает, даст каждый номер 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)
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
Больше агностика языка, но Вы могли использовать справочную таблицу.
Используйте случайное число в диапазоне 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
См. рецепт для метода псевдонима 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