package red;
import java.util.Random;
import java.util.Scanner;
class Program
{
public static void main(String[] args)
{
System.out.println("------模擬微信搶紅包------\n");
Scanner sc = new Scanner(System.in);
System.out.println("請輸入總金額");
double Total = sc.nextDouble();
System.out.println("請輸入紅包個數");
int Red = sc.nextInt();
double min = 0.01;//設定最小金額
Random random = new Random();//創造亂數
if (Total/Red==0.01)
{
for (int i = 1;i <= Red;i++)
{
double money = min; //設定每個紅包都是0.01;
System.out.println("第"+i+"個紅包"+String.format("%.2f",money)+"元");
}
}else if (Total/Red < 0.01) //當金額除以個數小于0.01時
{
System.out.println("每個人至少要走0.01分");
}else
{
for (int i = 1;i <= Red;i++)
{
double max = Total - (Red -i)*min; //紅包的最大值 = 余下的金額 減去(總紅包減去以及發送的紅包)*最小金額
double bound = max -min; //每一次random隨機的值的范圍都在最小值和最大值之間(min<=bound<max)
double safe=(double)random.nextInt((int) (bound*100))/100;//整數值轉化為double
double money = safe + min;//safe出來的值可能為0,每個包要有的0.01元
Total = Total-money;//這里就是下一個回圈可分配的錢數等于上一次可分配的錢數減去這一次已經分配的錢數
System.out.println("第"+i+"個紅包:"+String.format("%.2f", money)+"元");
}
}
}
}
從后面正常的分配紅包金額的時候,最大值會導致第一次分紅包就是最大值,有什么可以優化的地方 讓他像微信小程式發紅包一樣,有大的小的,中等的紅包,
uj5u.com熱心網友回復:
//……
double left = Total;
double avg = Total / Red;
for (int i = 1; i < Red; i++) {
int j = Red - i;
double max = left - j * min; // 紅包的最大值 = 余下的金額 減去(總紅包減去以及發送的紅包)*最小金額
// double bound = max -min; //每一次random隨機的值的范圍都在最小值和最大值之間(min<=bound<max)
// System.out.println(max);
double safe = random.nextDouble() * max;// 整數值轉化為double
while (j > 0) {
if (safe >avg) {
safe = random.nextDouble() * max;
}else {
break;
}
j--;
}
// System.out.println(safe);
if (safe <= 0.01)
safe = 0.01D;
// double money = safe + min;//safe出來的值可能為0,每個包要有的0.01元
left = left - safe;// 這里就是下一個回圈可分配的錢數等于上一次可分配的錢數減去這一次已經分配的錢數
System.out.println("第" + i + "個紅包:\t" + String.format("%.2f", safe) + "\t元");
}
System.out.println("第" + Red + "個紅包:\t" + String.format("%.2f", left) + "\t元");
//……
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/167007.html
標籤:Java相關
