@mir546
creator

Случайное число с заданной вероятностью, какой алгоритм?

Нужен алгоритм или хотя-бы предпосылка к нему
Цель:
задаётся от 0 до N чисел, N может быть 3-20
на выходе получаем случайное число в заданном диапазоне, при этом если сделать
1000 итераций, то получим что чисел лежащих ближе к 0 во много раз больше чисел которые лежат ближе к N.

к примеру от 0 до 8
то при 100или1000 итераций получим:
0 - 22%
1- 19%
2 - 16%
3 - 13%
4 - 10%
5 - 8%
6 - 6%
7 - 4%
8 - 2%
*числа примерные, только чтобы передать суть идеи
  • Вопрос задан
  • 1513 просмотров
Решения вопроса 2
sergiks
@sergiks Куратор тега Алгоритмы
♬♬
Делают длинный диапазон, составленный из отрезков, пропорциональных вероятностям.
0..22 : "0"
22..22+19=41: "1"
41..41+16=57: "2"
...
..100: "8"

Выбор из него с линейной вероятностью даст желаемое распределение.

Например, выпало 56 – попадает в диапазон, относящийся к "2"
Ответ написан
lxsmkv
@lxsmkv
Test automation engineer
Вот склепал на скорую руку:
https://repl.it/K2UJ/2
import random 

def getrand():
  r = random.randint(1,100)
  if  r < 23:
    return 0 # 22%
  if 42 > r >= 23:
    return 1 # 19%
  if 58 > r >= 41:
    return 2 # 16%
  if 71 > r >= 57:
    return 3 # 13%
  if 81 > r >=70:
    return 4 # 10%
  if 89 > r >=80:
    return 5 # 8 % 
  if 95 > r >=88:
    return 6 # 6%
  if 99 > r >=94:
    return 7 # 4%
  if 101 > r >=98:
    return 8 # 2 %
result = []
rng = 1000000
for x in range(0,rng):
  result.append(getrand())

print "0 : "+str(result.count(0)/float(rng))+" ~ " +str(0.22 - result.count(0)/float(rng))
print "1 : "+str(result.count(1)/float(rng))+" ~ " +str(0.19 - result.count(1)/float(rng))
print "2 : "+str(result.count(2)/float(rng))+" ~ " +str(0.16 - result.count(2)/float(rng))
print "3 : "+str(result.count(3)/float(rng))+" ~ " +str(0.13 - result.count(3)/float(rng))
print "4 : "+str(result.count(4)/float(rng))+" ~ " +str(0.10 - result.count(4)/float(rng))
print "5 : "+str(result.count(5)/float(rng))+" ~ " +str(0.08 - result.count(5)/float(rng))
print "6 : "+str(result.count(6)/float(rng))+" ~ " +str(0.06 - result.count(6)/float(rng))
print "7 : "+str(result.count(7)/float(rng))+" ~ " +str(0.04 - result.count(7)/float(rng))
print "8 : "+str(result.count(8)/float(rng))+" ~ " +str(0.02 - result.count(8)/float(rng))

freqs = [ result.count(0)/float(rng),result.count(1)/float(rng),result.count(2)/float(rng),result.count(3)/float(rng),
result.count(4)/float(rng),result.count(5)/float(rng),result.count(6)/float(rng),result.count(7)/float(rng),result.count(8)/float(rng)]

print sum(freqs)


0 : 0.219347 ~ 0.000653
1 : 0.190018 ~ -1.8e-05
2 : 0.160421 ~ -0.000421
3 : 0.129805 ~ 0.000195
4 : 0.100175 ~ -0.000175
5 : 0.07974 ~ 0.00026
6 : 0.060102 ~ -0.000102
7 : 0.040174 ~ -0.000174
8 : 0.020218 ~ -0.000218
1.0
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@res2001
Developer, ex-admin
Это называется "нормальное распределение". Почитайте вики на эту тему. Там довольно не плохая статья.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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