Рубрики
Без рубрики

Как реализовать выбор заданного соотношения с помощью случайной функции в режиме реального времени

Введение, каков эффективный способ алгоритма выбора с балансировкой нагрузки в режиме реального времени. Лучший ва… Помеченный как java, ratio, в реальном времени.

Вступление

Каков эффективный способ алгоритма выбора с балансировкой нагрузки в режиме реального времени? Лучший способ сделать это заключается в том, что он всегда вычисляет отдельное соотношение предыдущего и выбирает менее выбранную часть, а затем позволяет назначить ей новый запрос. Но это непросто и, скорее всего, будет сложно.

Здесь есть довольно простой и надежный способ сделать это. Давайте нырнем внутрь.

Логическое соображение

  1. Было бы лучше указать каждое соотношение, разделенное точкой с запятой. например, “10:30:40:20”
  2. Он будет использовать случайный класс, предоставляемый Java.
  3. И возвращаемое значение должно быть индексом среди указанных коэффициентов.

Последовательный поток

  1. Создайте случайный объект.
  2. Составьте сумму всех коэффициентов.
  3. Генерируйте случайное целое значение в диапазоне от 0 до суммы.
  4. Сравните случайное значение, в котором оно находится.
  5. Возвращает индекс в диапазоне между коэффициентами

Проверка кода

package org.chaostocosmos.dev.io;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Random;
import java.util.stream.Collectors;

public class RandomRatioIndexSelection {

    List ratioList;

    public RandomRatioIndexSelection(String ratioExpr) {
        this(Arrays.asList(ratioExpr.split(":")).stream().map(e -> Integer.parseInt(e)).collect(Collectors.toList()));
    }

    public RandomRatioIndexSelection(List ratioList) {
        this.ratioList = ratioList;
    }

    public int getSelectIndex() {
        Random random = new Random();
        int sum = ratioList.stream().reduce((a, b) -> Integer.sum(a, b)).get().intValue();
        int start = 0;
        int bound = 0;
        int ran = random.nextInt(sum);
        for (int i = 0; i < ratioList.size(); i++) {
            int ratio = ratioList.get(i);
            bound += ratio;
            if (ran >= start && ran < bound) {
                return i;
            }
            start += ratio;
        }
        return -1;
    }

    public static void main(String[] args) {
        RandomRatioIndexSelection rris = new RandomRatioIndexSelection("10:30:40:20");
        List ratioList = new ArrayList();
        for(int i=0; i<10000; i++) {
            int index = rris.getSelectIndex();
            ratioList.add(index);
        }
        long r0 = ratioList.stream().filter(i -> i == 0).count();
        long r1 = ratioList.stream().filter(i -> i == 1).count();
        long r2 = ratioList.stream().filter(i -> i == 2).count();
        long r3 = ratioList.stream().filter(i -> i == 3).count();
        System.out.println("Toal count: "+r0+"  "+r1+"  "+r2+"  "+r3);
    }
}

Тест-драйв

Если вы запустите приведенный выше код, результат будет таким, как показано на рисунке ниже.

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

Вывод

Мы уже говорили о том, как реализовать случайно выбранный индекс с заданными коэффициентами. Я предполагаю, что это может означать, что требуется балансировка нагрузки службы, для этого, возможно, придется настроить. Всегда эластичное мышление – это ваше!

Спасибо.

Оригинал: “https://dev.to/kooin/how-to-implement-to-select-specified-ratio-using-random-function-in-real-time-2cme”