LINUX.ORG.RU

Как получить случайное число с учетом коэффициентов ?


0

1

Предположим у меня есть некий dictionary с коэффициентами ( для примера взят python но не суть ):

test = []

test['a1'] = 0.1

...

test['a2'] = 0.9

нужно получить случайным образом ключи данного dictionary с учетом данных коэффициентов ( т е чтобы для 100% запросов отдавалось примерно 90% a1 и 10% a2 ). Как это сделать ?

★★☆☆

Последнее исправление: SI (всего исправлений: 2)

Разбей отрезок, по которому генеришь случайную величину на отрезки, пропорциональные коэффициентам. Потом простой проверкой, в какой отрезок попала случайная величина.

red1ynx
()
rnd = random(0, 1) # [0;1] range
if rnd <= 0.1:
  return 'a1'
else:
  return 'a2'
true_admin ★★★★★
()

Выше тебе правильно написали, это иногда называют эмуляцией рулетки с секторами, длины которых пропорциональны коэффициентам из test. Но прямая эмуляция обладает недостатком, когда на небольших выборках некоторые сектора у тебя могут никогда не выпасть. Т.е. при разных запусках процесса статистика будет сильно «плавать». Чтобы частично избежать этого, применяют мледующую модификацию. Пусть тебе нужно сгенерировать в итоге N индексов из мн-ва {a1, a2, ...}. Тогда вся длина рулетки (=1 обычно, т.е. тебе коэффициенты надо отнормировать sum(test) = 1) разбивается на N одинаковых маленьких отрезков с длиной 1/N. Разбивку обычно начинают со случайного отступа в пределах длины одного отрезка. Потом смотришь, в какой сектор попадает конец каждого отрезка и выписываешь индексы секторов. Получается последовательность типа {0,0,0,1,1,2,2,2,2,2,2,3,...}. Случайным образом ее перемешиваешь и вуаля!

Вообще, так работает оператор селекции генетического алгоритма и то, что я описал, называется Stochastic Uniform Sampling.

universe_entity
()
Ответ на: комментарий от anonymous

Аноним, где ты был, когда мне понадобилось моделировать получение УФ-спектра при помощи МКП+КПА?

// «методом тыка», ничего особо путного не нагуглив, применял преобразования на основе обратной функции.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от universe_entity

Случайным образом ее перемешиваешь и вуаля!

Посмотрю я на это «вуаля», когда N равно, скажем, десятку миллиардов!

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

Дык в теории чем больше N, тем лучше будет результат ;) Хотя, 10 млрд значений, конечно, не сохранишь, да и шаг будет очень маленький и начнутся всякие ошибки округления. При таком большом N прямая эмуляция рулетки, как написал true_admin, будет предпочтительнее.

universe_entity
()
Ответ на: комментарий от universe_entity

начнутся всякие ошибки округления

Какие, нафиг, ошибки округления, если ты дискретное распределение эмулируешь?

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от universe_entity

Да при чем здесь шаг? При моделировании методом обратной функции мы можем выбирать соответствия для равномерного распределения как из квазинепрерывной, так и из дискретной функции!

Eddy_Em ☆☆☆☆☆
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.