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);
}
}
}
紅包隨機金額生成的方法
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.