JAVA job-multi-threaded to grab red envelopes

JAVA job-multi-threaded to grab red envelopes

General idea

For the distribution of red envelopes, see JAVA homework-red envelope distribution .
And grab the red envelope to solve the thread problem.
In fact, it's relatively simple. Set the number of people, one thread for each person, and execute each thread once. If there is a red envelope, you can grab it. If you don't have a red envelope, you won't be able to grab it. So in the run function, just judge whether there is a red envelope.

Code

import java.util.Random;
import java.util.Scanner;

public class Main {
    
    
    public static void main(String[] args) {
    
    
        int person_num, red_pocket_num, sum_money;
        Scanner scanner = new Scanner(System.in);
        System.out.println("请设置红包个数:");
        red_pocket_num = scanner.nextInt();
        System.out.println("请设置总金额数量(分):");
        sum_money = scanner.nextInt();
        if(sum_money < red_pocket_num) {
    
    
            System.out.println("钱不够,退出程序。");
            return;
        }
        System.out.println("请设置抢红包成员个数:");
        person_num = scanner.nextInt();
        myRunnable myrunnable = new myRunnable(sum_money,red_pocket_num);
        Thread []person = new Thread[person_num];
        for (int i = 0; i < person_num; i++) {
    
    
            person[i] = new Thread(myrunnable);
            person[i].setName("用户"+(i+1));
            person[i].start();
        }
    }
}
class myRunnable implements Runnable{
    
    
    private int []red_pocket;
    private int num;
    private int now_num;
    public myRunnable(int money, int num) {
    
    
        this.red_pocket = new Red_Pocket(money, num).get_red_packets();
        this.num = num;
        this.now_num = num;
    }
    @Override
    public void run() {
    
    
        if(this.num>0){
    
    
            System.out.println(Thread.currentThread().getName()+"抢到了红包 "+(this.num-this.now_num+1)+" : "+red_pocket[--this.now_num]+"分");
        }
        else{
    
    
            System.out.println(Thread.currentThread().getName()+"未抢到红包。");
        }
    }
}
class Red_Pocket{
    
    
    private long seed;
    private int money;
    private int num;
    public int[] get_red_packets() {
    
    
        if(this.money < this.num) return new int[0];
        Random random = new Random(this.seed);
        this.seed = random.nextLong();
        int[] res = new int[this.num];
        double[] temp = new double[this.num];
        double sum = 0;
        int sum2 = 0;
        for (int i = 0; i < this.num; i++) {
    
    
            temp[i] = random.nextDouble();
            sum += temp[i];
        }
        for (int i = 0; i < this.num; i++) {
    
    
            res[i] = 1 + (int)(temp[i] / sum * (this.money - this.num));
            sum2 += res[i];
        }
        res[random.nextInt(this.num)] += this.money - sum2;
        return res;
    }
    private void init() {
    
    
        this.seed = new Random(System.currentTimeMillis()).nextLong();
    }
    public Red_Pocket(int money,int num) {
    
    
        init();
        this.money = money;
        this.num = num;
    }
}

Guess you like

Origin blog.csdn.net/Evrse/article/details/112105591