Как случайно уравнять неравные значения?

Скажем, у меня есть несколько неравных значений a, b, c, d, e. Можно ли превратить эти неравные значения в равные значения, просто используя генерацию случайных чисел?

Пример: а=100, b=140, c=200, d=2, e=1000. Я хочу, чтобы алгоритм случайным образом нацеливался на эти наборы, чтобы наибольшее значение использовалось чаще всего, а наименьшее значение оставалось в покое для большинства частей.

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

Я хочу, чтобы соотношение между значениями постепенно приближалось к 1 по мере выполнения алгоритма.

Другой способ решить проблему: скажем, эти значения a, b, c, d, e равны. Если мы случайно выберем один, каждый из них будет выбран с такой же вероятностью, как и любой другой. После того, как мы выберем один, мы добавляем 1 к этому значению. Затем снова запускаем этот процесс. На этот раз значение, которое было выбрано в прошлый раз, на 1 больше, чем любое другое значение, поэтому вероятность выбора его выше, чем любого другого значения. Это создает эффект снежного кома, когда значение, выбранное первым, скорее всего, будет продолжать выбираться и достигать стремительного роста. Я ищу противоположность этому алгоритму, когда мы начинаем после того, как эти изначально равные значения расходятся, и возвращаем их в исходно-равное состояние.

Я думаю, что этот процесс невозможен из-за энтропии и врожденной односторонней природы существования.


person EternalPropagation    schedule 29.11.2018    source источник


Ответы (1)


Что ж, есть метод, называемый обратными весами, когда вы отбираете элементы, обратно пропорциональные их предыдущему внешнему виду. Каждый раз, когда мы выбираем a, b, c, d или e, мы обновляем их номера появления и пересчитываем вероятности. Простой код Python, я выбираю числа [0...4] как a, b, c, d, e и начинаю с того, что вы указали как внешний вид. После 100 000 выборок они выглядят равнораспределенными.

import numpy as np

n = np.array([100, 140, 200, 2, 1000])

for k in range(1, 100000):

    p  = (1.0 / n) # make probabilities inverse to weights
    p /= np.sum(p) # normalization

    a = np.random.choice(5, p = p) # sampling numbers in the range [0...5)

    n[a] += 1 # update weights

print(n)

Выход

[20260 20194 20290 20305 20392]
person Severin Pappadeux    schedule 29.11.2018
comment
Проблема в том, что значение 1000 может быть разделено на два разных значения и по-прежнему сохранять большую общую долю после завершения вывода. Любое дробление ценностей не должно допускать такого обмана. Я должен был указать это, извините. Вот почему я спрашивал о работе в обратном направлении, уменьшая значения. - person EternalPropagation; 29.11.2018
comment
@EternalPropagation извините, не понимаю - если оно разделено на разные значения, какова общая доля? Не могли бы вы обновить вопрос с примером, что вы хотите? Потому что явно противоречие - либо это разные значения и мой алгоритм их уравняет, либо нет... - person Severin Pappadeux; 29.11.2018