紅包隨機金額生成的方法

package com.dou361.utils;

import java.util.Random;

/**
 * ========================================
 * <p/>
 * 版 權:dou361 版權所有 (C) 2015
 * <p/>
 * 作 者:糾結的小明
 * <p/>
 * 個人網站:http://www.dou361.com
 * <p/>
 * 版 本:1.0
 * <p/>
 * 創建日期:2016/1/19
 * <p/>
 * 描 述:
 * <p/>
 * <p/>
 * 修訂歷史:
 * <p/>
 * ========================================
 */
public class NumberUtils {

    /**
     * @param args
     */

    public static void main(String[] args) {
        System.out.println("---------------------開始操作-------------------");
        createRomNumber(30, 20, 0.01, 30, 2);
        System.out.println("---------------------操作完成-------------------");

    }


    /**
     * 隨機紅包@total 紅包總數 @number 紅包個數 @min 紅包最小值 @min 紅包最大值 @accuracy 紅包精確到多少位
     */
    public static void createRomNumber(double total, int number, double min, double max, int accuracy) {
        if (total < 0) {
            System.out.println("紅包總金額不能爲負數!");
            return;
        }
        if (number < 0) {
            System.out.println("紅包數不能爲負數!");
            return;
        }
        if (min < 0 || min * number > total) {
            System.out.println("紅包最小值爲負數或者超出平均紅包金額!");
            return;
        }
        if (max < min) {
            System.out.println("紅包最大值必須大於最小值!");
            return;
        }
        /** 默認精度爲兩位 */
        if (accuracy <= 0) {
            accuracy = 2;
        }

        Random rd = new Random();
        /** 總隨機餘額 */
        double totalRdNumber = total - number * min;
        /** 當前最大和最小金額總偏差 */
        double totalOffset = max - min;
        /** 當前最大發的隨機部分的金額 */
        double currentMaxSend = 0;
        /** 統計紅包 */
        double countNumber = 0;
        /** 當前最小發的隨機部分的金額 */
        double currentMinSend = 0;
        /** 當前紅包 */
        double money = 0;
        System.out.println("總金額:" + "-----------" + total);
        System.out.println("總紅包數:" + "-----------" + number);
        System.out.println("總隨機餘額:" + "-----------" + totalRdNumber);
        System.out.println("--------------------------------------");
        for (int i = 0; i < number; i++) {
            if (i == number - 1) {
                /** 最後一個紅包 */
                money = total - countNumber;
            } else {
                /** 當前剩餘可隨機的餘額 */
                double rdNumber = totalRdNumber - countNumber + i * min;
                if (rdNumber < 0) {
                    currentMinSend = 0;
                    currentMaxSend = 0;
                } else if (rdNumber < totalOffset) {
                    currentMinSend = 0;
                    currentMaxSend = rdNumber;
                } else if (rdNumber - (number - i - 1) * totalOffset < 0) {
                    currentMinSend = 0;
                    currentMaxSend = totalOffset;
                } else if (rdNumber - (number - i - 1) * totalOffset < totalOffset) {
                    currentMinSend = rdNumber - (number - i - 1) * totalOffset;
                    currentMaxSend = totalOffset;
                } else {
                    currentMinSend = totalOffset;
                    currentMaxSend = totalOffset;
                }
                money = min + (currentMinSend * Math.pow(10, accuracy) + rd.nextInt((int) (currentMaxSend * Math.pow(10, accuracy)))) / Math.pow(10, accuracy);
            }
            money = Math.round(Math.pow(10, accuracy) * money) / Math.pow(10, accuracy);

            countNumber += money;
            System.out.println("第" + (i + 1) + "個紅包:" + "-----------" + money);
        }

    }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章