抢红包

抢红包规则

1.所有人抢到金额之和等于红包金额,不能超过,也不能少于。

2.每个人至少抢到一分钱。

3.要保证所有人抢到金额的几率相等。

 

 线段切割法

const redPacket = () => {
    const people = 3;  
    const allMoney = 100;
    let list: any = [];
    let i = 1;
    while (i < people) {    
      i++;
      const reg = /^(([1-9]{1}\d*)|(0{1}))(\.\d{1})/;                  //正则  保留小数点后1位
      const dot = parseFloat((Math.random() * allMoney+0.1).toString().match(reg)![0]);    // Math.random() * allMoney+0.1 保证最小为0.1
      if (list.some((value: number) => value === dot)) {      // 防止点重复
        i--;
      }
      list = [...list, dot];
    }
    list = [...list, 0, allMoney].sort((a: number, b: number) => a - b);   // 排序 
    const getRedPacketlist=list
    .map((value: number, index: number): any => {
      if (index < list.length - 1) {
        return (list[index + 1] - value).toFixed(1);                // 由于精度问题 需要用toFixed处理
      }
    })
    .toString()
    .replaceAll(',', ' ')
    console.log('红包列',getRedPacketlist)
  };
 
// 时间复杂度 待优化。。。。
 
 
posted @ 2021-04-22 14:19  四国诸葛不亮  阅读(668)  评论(0编辑  收藏  举报