За исключением деталей реализации (массивы, против других методов), желаемый результат для проблемы нашего клиента был следующим: *
Всегда иметь как можно ближе к 1 / N стимулов в каждом изN потенциальных локаций, но делайте это случайным образом (трудно предсказать).
Это обычно требуется в играх (при распределении объектов, персонажей, статистики, ...), и я быпредставьте себе множество других приложений.
Мой предпочтительный метод для решения этой проблемы - динамическое взвешивание предполагаемых вероятностей в зависимости от того, как далеко продвинулся эксперимент.Это эффективно отодвигает нас от независимо нарисованных переменных.
- Пусть p [i] будет искомой вероятностью результата i
- Пусть N [i] будет количеством раз, которое у меня будет результатпроизошло до сих пор
- Пусть N будет суммой N [] для всех результатов i
- Пусть w [i] будет корректирующим весом для i
- Пусть W_Max будетмаксимальный вес, который вы хотите присвоить (т. е. когда результат произошел 0 раз)
- Пусть P [i] будет ненормированной вероятностью для i
- Тогда p_c [i] является скорректированной вероятностью дляi
p [i] исправлен и предусмотрен проектом.N [i] - это накопление - каждый раз, когда происходит i, приращение N [i] на 1.
w [i] задается как
w[i] = CalculateWeight(p[i], N[i], N, W_Max)
{
if (N == 0) return 1;
if (N[i] == 0) return W_Max;
intended = p[i] * N
current = N[i]
return intended / current;
}
И P [i] задаетсяна
P[i] = p[i] * w[i]
Затем мы вычисляем p_c [i] как
p_c[i] = P[i] / sum(P[i])
И запускаем следующую итерацию нашего случайного эксперимента (выборки) с p_c [i] вместо p [i] для результата i.
Главный недостаток - то, что вы торгуете для предсказуемости.После 4 хвостов подряд весьма вероятно, что вы увидите головку.
Примечание 1 :: Описанный метод обеспечит на любом этапе распределение, близкое к оригинальному, если результаты эксперимента соответствуют предполагаемымрезультаты или отклонены к (отдаленным) результатам, которые произошли меньше (больше), чем предполагалось.
Примечание 2 :: Вы можете ввести «контрольный» параметр c и добавить дополнительный шаг.
p_c2[i] = c * p_c[i] + (1-c) * p[i]
Для c = 1 по умолчанию используется описанный метод, для c = 0 - по умолчанию исходные вероятности (независимо нарисованные переменные).