Distribución de sobres rojos de tareas de JAVA

Vi el número de visitas y me gusta al lado. También tengo un blog, probablemente nadie lo lea.
Análisis de problemas
1. Cómo asegurar la cantidad aleatoria de dinero.
2. Mantener dos lugares decimales provocará el problema de la discrepancia entre la cantidad distribuida y la cantidad total.
Solución
1. Usamos una matriz para almacenar los números aleatorios de los sobres rojos (matriz corrida), y usamos una variable (suma) para acumular cada número aleatorio, de modo que la cantidad de sobres rojos tomados por la i-ésima persona sea ans[i] = ran[i]*money/sum;
2, dividimos Habrá muchos decimales, y generalmente tomamos sobres rojos con solo 2 decimales, por lo que solo debemos mantener dos decimales, pero supongamos que hay 10,000 sobres rojos como 0.001, todos agarran 0.001, solo nos quedamos dos Bit significa que la cantidad que agarramos es 0. Tencent ganó 10 yuanes con lágrimas y sangre. (No parece hacer mucho ...), por lo que deberíamos adoptar el siguiente esquema.

 double[] ans  = new double[num];    //用来存取每个人分到的金额。
        double sum2= 0;                     //用来存取每个分到的金额的和
        for(int i=0;i<num;i++)
        {
    
    
            ans[i] = (int)(ran[i]*money/sum * 100);         //ran[i]*money/sum 即这个人应该分到的金额,注意ran[i]/sum 因为sum和ran[i]都是随机数所以可以随机分发红包。
            sum2 += ans[i];                                     //(ran[i]*money/sum * 100);  乘100即将小数点后两位变成了整数,然后转换为int即保留了两位小数。
            ans[i]/=100;
        }
        sum2/=100;                              //将sum2处于一百,即生成小数点后两位
        double temp = money - sum2;             //temp = money - sum2 temp 即因为每份红包只保留2位小数导致与红包总金额的差值
        ans[r.nextInt(num)] += temp;            //将这个差值随机加入一个红包内

Entonces puedes escribir código felizmente.
Código de función principal:

package ex1;
import java.util.List;
import java.util.Random;
import java.util.Scanner;
public class Main {
    
    
    public static void main(String[] args) {
    
    
        double money;
        int num;
        Scanner cin = new Scanner(System.in);

        do{
    
    
            System.out.print("请输入红包总金额:");
            money = cin.nextDouble();
            if(money<0.01) System.out.println("红包总金额不合法,请重新输入。");
        }while(money <0.01);

        do{
    
    
            System.out.print("请输入红包个数:");
            num = cin.nextInt();
            if(num<=0 || num>=10005)  System.out.println("红包个数不合法,请重新输入。");
            if(money/num < 0.01) System.out.println("每个人分到的钱连0.01都不到,请重新输入份数");
        }while(num<=0 ||(money/num < 0.01));

        RedPacket rp0 = new RedPacket(money,num);

        int[] ran = new int[num]; //用来存取随机数
        Random r = new Random();
        int sum = 0,x;  //sum用来记录所有随机数的和,x用来存取随机数。
        for(int i = 0;i<num;i++)
        {
    
    
            x = r.nextInt(100);
            sum += x;
            ran[i] =x;
        }

        double[] ans  = new double[num];    //用来存取每个人分到的金额。
        double sum2= 0;                     //用来存取每个分到的金额的和
        for(int i=0;i<num;i++)
        {
    
    
            ans[i] = (int)(ran[i]*money/sum * 100);         //ran[i]*money/sum 即这个人应该分到的金额,注意ran[i]/sum 因为sum和ran[i]都是随机数所以可以随机分发红包。
            sum2 += ans[i];                                     //(ran[i]*money/sum * 100);  乘100即将小数点后两位变成了整数,然后转换为int即保留了两位小数。
            ans[i]/=100;
        }
        sum2/=100;                              //将sum2处于一百,即生成小数点后两位
        double temp = money - sum2;             //temp = money - sum2 temp 即因为每份红包只保留2位小数导致与红包总金额的差值
        ans[r.nextInt(num)] += temp;            //将这个差值随机加入一个红包内
        double flag = 0;    //检测各个红包金额的和是否可以等于总金额
        for(int i = 0;i<num;i++)
        {
    
    
            flag += ans[i];
            System.out.printf("%.2f\n",ans[i]);
        }
        if(Math.abs(flag-money) < 1e-8){
    
    
            System.out.println("相等");
        }else System.out.println("不相等");
    }
}

Código de sobre rojo:

package ex1;

public class RedPacket {
    
    
    private double money;   ///红包金额
    private int num;    //红包个数
    public RedPacket(double money, int num) {
    
    
        this.money = money;
        this.num = num;
    }

    public RedPacket(){
    
    }

    public double getMoney() {
    
    
        return money;
    }

    public int getNum() {
    
    
        return num;
    }

    public void setMoney(double money) {
    
    
        this.money = money;
    }

    public void setNum(int num) {
    
    
        this.num = num;
    }
}

Es posible que el enlace de al lado
aún tenga detalles incompletos. Bienvenidos a todos para que me corrijan.

Supongo que te gusta

Origin blog.csdn.net/weixin_45822897/article/details/110734534
Recomendado
Clasificación