Как разделить поток значений в процентном соотношении?

Добрый вечер!
Суть вопроса:

есть постоянно поступающие значения, нужно их записывать в процентном соотношении в 3 массива. Проценты можно менять.

Например:
50% - 20% - 30%
соответственно идет половина от всех в первый массив, 1/5 в второй массив и 30% в третий массив.
Сложность в том что нам неведомо окончательное количество значений и нужно как то на ходу распределять.
  • Вопрос задан
  • 561 просмотр
Пригласить эксперта
Ответы на вопрос 4
x67
@x67
Детерменированный метод - точность до константы:
Пусть, вероятность попадания - 40%, 30%, 30%. Пришло сообщение на распределитель, у него есть персональный номер (внутри распределителя по крайней мере), если остаток от деления на 10 меньше или равен 3, он идет в первый поток., от 4 до 7 - второй поток, от 7 до 9 - в третий. Нужна точность вплоть до процента? Делим номер на 100, а не на 10, ну и тд. Нужна высокая точность и более равномерная загрузка? Легко, A+B+C=100%, выражаем вероятности B и C через А и некую дельту вот так А+(А+d1)+(A+d2)=100%, Предположим у нас те же 10 сообщений. Сначала d1 сообщений пойдет в поток 2, потом по очереди по А сообщений пойдет в каждый поток по порядку и наконец d2 сообщений пойдет в поток 3. И счет начинается сначала. Можно еще больше оптимизировать, но это уже сами додумывайте или нанимайте человека, который потратит на это время за ваши деньги.
Стохастический метод:
Наиболее интересный, на мой взгляд, но точность его при малом количестве сообщений будет очень низкой. Берем генератор равномерного псевдорандома и превращаем его в генератор заданной вероятности (если сами не додумаете как, на тостере этот вопрос неоднократно задавался, да и наверняка есть готовыые библиотеки), задаем вероятности и при каждом новом сообщении "бросаем кости". Куда генератор укажет, туда сообщение и попадет. Проблем с загрузкой каналов при большом количестве сообщений у него нет.
Ответ написан
NYMEZIDE
@NYMEZIDE
резюме - ivanfilatov.ru
random(100) <= 50 - первая очередь
50 < random(100) <=70 - вторая очередь
70 < random(100) - третья очередь
Ответ написан
@McBernar
У меня есть три друга. Я хочу дать одному 50% от суммы денег, другому 30%, а третьему 20%.
Количество денег, которые я хочу раздать неизвестно.
Сколько денег дать каждому другу?

Есть у этой задачи решение?
Ответ написан
Накопил 10 - поделил 5 - 2 -3
Так повторяешь, пока не получишь последние.
Если остаток меньше 10, делишь в процентном соотношении.
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы