リアルタイムでランダム関数を用いて指定比を選択する方法


イントロ


実時間での負荷均衡選択アルゴリズムの効率的方法
これの最良の方法は、それは常に前の比を計算し、選択された部分をピックアップし、新しい要求を割り当てられるようにすることです.
しかし、それは簡単ではなく、複雑になりそうです.
ここでは、非常にシンプルで信頼できる方法があります.
飛び込みましょう.

論理的考察

  • これは、セミコロンで区切られた各比率を指定するために表現されます.例えば「10 : 30 : 40 : 20」
  • Javaで提供されるランダムクラスを使用します.
  • 返り値は指定した比率のインデックスとなります.
  • 連続流

  • ランダムオブジェクトを作成します.
  • すべての比率の合計を行います.
  • 0から合計までランダムな整数値を生成します.
  • それが置かれているランダムな値を比較してください.
  • 比率の範囲のインデックスを返す
  • コードレビュー


    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<Integer> ratioList;
    
        public RandomRatioIndexSelection(String ratioExpr) {
            this(Arrays.asList(ratioExpr.split(":")).stream().map(e -> Integer.parseInt(e)).collect(Collectors.toList()));
        }
    
        public RandomRatioIndexSelection(List<Integer> 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<Integer> ratioList = new ArrayList<Integer>();
            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);
        }
    }
    
    

    テストダイビング


    コードを実行すると、結果は次のようになります.

    それは、インデックスの数は、比率の各部分として選択されるものを示しています.でも変なところがあります.インデックスカウントは、比率と正確に一致しません.
    それはランダムな機能に基づいているため、それは静的な計算ではないが、それはまた、継続的に処理するためにカウントするリアルタイムです.したがって、ある比率は指定された比率と若干の違いを持つかもしれません.

    結論


    私たちはランダム選択されたインデックスを与えられた比率を実装する方法について話しました.私は、これがサービスがロードバランシングを必要とすると貢献することができたと思います、そのために、カスタマイズされなければならないかもしれません.
    常に弾力的な思考はあなたです!
    ありがとう.