Java Redパケットアルゴリズム・リターンリスト

/ * 0.00の後の仮数は、赤いエンベロープ処理に表示されます。

最初にget <Double>データを取得するには、赤(整数、倍の合計、倍の最小)を使用します。

取得後、red_all_count(List <Double> red_all_count)を使用して合計金額を取得します。比較のために、赤いエンベロープの数が少ない場合はエラーは小さく、生成される赤いエンベロープが多いほど、エラーが大きくなる可能性があります。

* /

//テスト

public static void main(String [] args){
List <Double> ld = red(1000、5000、0.01);
red_all_count(ld);
}

/ **
* @param red_all_count
* @return合計金額
* /
public static double red_all_count(List <Double> red_all_count){
double dou = 0.0;
(Double double1:red_all_count){
dou + = double1;
}
BigDecimal bg = new BigDecimal(dou);
   double d3 = bg.setScale(2、BigDecimal.ROUND_HALF_UP).doubleValue();
d3を返します。
}


/ **

* @paramコピーの総数:数
* @param合計金額:合計
* @param最小量:最小
* doubleListを返す
* /
public static List <Double> red(int number、double total、double min){

//赤いパケットの数
//合計赤い封筒
ダブルマネー;
//最小の赤い封筒
ダブルマックス;
int i = 1;
List <Double> list = new ArrayList <Double>();
if(number == 1){
list.add(total);
リストを返す;
}
DecimalFormat df = new DecimalFormat( "###。##");
while(i <number){
// 1つの赤い封筒が最大で残りの赤い封筒である場合でも、各赤い封筒が最小値を下回らないようにします
最大=合計-最小*(数値-i);
int k =(int)(number-i)/ 2;
//最後の2人が取った赤い封筒が残りの赤い封筒を超えないようにします
if(number-i <= 2){
k =数値-i;
}
//最大の赤い封筒で制限されたオンラインとオフラインの平均
max = max / k;
//各赤いエンベロープが最小値より大きく、最大値以下であることを確認します
money =(int)(min * 100 + Math.random()
*(最大* 100-最小* 100 + 1));
money =(float)money / 100;
//小数点以下2桁を保持します
money = Double.parseDouble(df.format(money));
if(money <0.01){
money = DoubleUtil.changeDoubleTwo(min);
}
合計=(int)(合計* 100-お金* 100);
合計=合計/ 100;
System.out.println( "残り金額:" + total + "、この赤い封筒が生成されます:" + DoubleUtil.changeDoubleTwo(money));
list.add(money);
i ++;
//最後の人が残りの赤い封筒を受け取ります
if(i == number){

list.add(total);

System.out.println( "残り金額:" + total + "、この赤い封筒が生成されます:" + DoubleUtil.changeDoubleTwo(money));

}
}
//配列内の最大値のインデックスを取得します

リストを返す;

}

おすすめ

転載: blog.csdn.net/feng8403000/article/details/78442968