Обновление : Да, вы правы, результат распределен неравномерно.
Допустим, ваши процентные значения являются натуральными числами (если это предположение неверно, вы недолжен читать дальше :) В этом случае у меня нет решения).
Давайте определим событие e
как кортеж из 3 значений (процент от каждого сегмента): e = (p a , p b , p c ).Далее создайте все возможные события e n .Здесь у вас есть кортеж, состоящий из дискретного числа событий.Все возможные события должны иметь одинаковую возможность происходить.
Допустим, у нас есть функция f (n) => e n .Затем все, что нам нужно сделать, это взять случайное число n и вернуть e n за один проход.
Теперь остается проблема создания такой функции f
:)
В псевдокоде очень медленный метод (только для иллюстрации):
function f(n) {
int c = 0
for i in [10..70] {
for j in [10..50] {
for k in [5..25] {
if(i + j + k == 100) {
if(n == c) {
return (i, j, k) // found event!
} else {
c = c + 1
}
}
}
}
}
}
То, что вы знаете, - это однопроходное решение, но проблема только удалена.Функция f очень медленная.Но вы можете сделать лучше: я думаю, что вы можете вычислить все немного быстрее, если вы правильно установите свои диапазоны и вычислите смещения вместо итерации по вашим диапазонам.
Достаточно ли ясно это?* Прежде всего вам, вероятно, придется скорректировать свои диапазоны.10% в ведре a
невозможно, поскольку вы не можете удержать условие a+b+c = number
.
По вашему вопросу: (1) Выберите случайное число для ведра a
в вашем диапазоне,затем (2) обновите диапазон для сегмента b
с минимальным и максимальным процентом (вам следует только сузить диапазон).Затем (3) выберите случайное число для ведра b
.В конце c
следует рассчитать, что ваше условие выполнено (4).
Пример:
n = 1000
(1) a = 40%
(2) range b [35,50], because 40+35+25 = 100%
(3) b = 45%
(4) c = 100-40-45 = 15%
Или:
n = 1000
(1) a = 70%
(2) range b [10,25], because 70+25+5 = 100%
(3) b = 20%
(4) c = 100-70-20 = 10%
Это проверить,все события распределены равномерно.Если это должно быть проблемой, вы можете рандомизировать обновление диапазона в шаге 2.