1. 程式人生 > >超簡單的JAVA 權重分配,支援多個權重,完美實現五五開,等任何比列.

超簡單的JAVA 權重分配,支援多個權重,完美實現五五開,等任何比列.

/**
 * 根據總訂單數和分配的訂單數動態調整下次分配比例
 */
public class WeightTest
{
    public static void main(String[] args) {
        int number = 1000;//假設1000個訂單數
        Double[] weight = new Double[]{1D,2D,3D,4D,5D};
        //已分配訂單數
        Integer[] count = new Integer[weight.length];
        for(int i= 0 ;i <number;i++)
        {
            //當前權重
            Double[] current = new Double[weight.length];
            for(int w=0;w<weight.length;w++)
            {
                current[w] = weight[w]/(count[w]==null?1:count[w]);
            }
            int index = 0;
            Double currentMax = current[0];
            for(int d=1; d<current.length;d++)
            {
                //考慮全等的情況
                Boolean isTrue = true;
                while (isTrue)
                {
                    Set set = new HashSet();
                    for(Double c : current)
                    {
                        set.add(c);
                    }
                    if(set.size()==1)
                    {//代表全等
                        for(int e=0; e<current.length;e++)
                        {
                            current[e] = current[e]*Math.random();
                        }
                    }else
                        {
                            isTrue = false;
                        }
                }
                //比較所有的數,尋找出下標最大的哪一位
                if(currentMax<current[d])
                {
                    currentMax=current[d];
                    index =d;
                }
            }
            count[index]=count[index]==null?1:count[index]+1;
        }
       for(Integer i :count)
       {
           System.err.println(i);
       }

------------------------------

1:2 開

1:2:3:4:5 輸出如下

全部都是5 5 開的情況

說不上演算法,只是解決了自己再業務邏輯中的一些問題,如果有錯誤,請指正,希望大神不要噴~