Red packet algorithm 2020-03-31 23:17

This is an interview question. Not fully understood yet. ;(

  • The red envelope algorithm, given a total amount of red envelopes and the number of dividend payers, outputs the number of red envelopes randomly grabbed by each person.
  • Claim:
  • Everyone must grab the red envelope, and the amount is random
  • The amount of money each person grabs is not less than 1
  • The amount of money each person grabs does not exceed 30% of the total amount
  • For example, the total amount is 100, the number of people is 10, and the output is [19 20 15 1 25 14 2 2 1 1]
public class RedPacketClient {
    private static final int min = 1;
    private static final double percentMax = 0.3;

    public static void main(String[] args) {
        int money = 100;
        int people = 10;
        int maxMoney = (int) (percentMax * money);
        allocateMoney(money, people, maxMoney);
    }

    private static void allocateMoney(int money, int peopleNum, int maxMoney) {
        int minMoney = min;
        int shareMoney = 0;
        int sum = 0;
        for (int i = 0; i < peopleNum; i++) {
            minMoney = minMoney > money - maxMoney * (peopleNum - i - 1) ? minMoney : (money - maxMoney * (peopleNum - i - 1));
            maxMoney = maxMoney < money - minMoney * (peopleNum - i - 1) ? maxMoney : (money - minMoney * (peopleNum - i - 1));
            shareMoney = (int) Math.floor((maxMoney - minMoney) * Math.random() + minMoney);
            money = money - shareMoney;
            sum += shareMoney;
            System.out.println("people num " + (i + 1) + " gets :" + shareMoney);
        }
        System.out.println("sum money:" + sum);
    }
}

Find the random range is the key of this problem.

EOF