网站h标签,秦皇岛seo优化,企业品牌策划,c语言做的网站发出一个固定金额的红包#xff0c;由若干个人来抢#xff0c;需要满足哪些规则#xff1f;1.所有人抢到金额之和等于红包金额#xff0c;不能超过#xff0c;也不能少于。2.每个人至少抢到一分钱。3.要保证所有人抢到金额的几率相等。小灰的思路是什么样呢#xff1f;每…发出一个固定金额的红包由若干个人来抢需要满足哪些规则1.所有人抢到金额之和等于红包金额不能超过也不能少于。2.每个人至少抢到一分钱。3.要保证所有人抢到金额的几率相等。小灰的思路是什么样呢每次抢到的金额 随机区间 ( 0, 剩余金额 )为什么这么说呢让我们看一个栗子假设有10个人红包总额100元。第一个人的随机范围是(0100元)平均可以抢到50元。假设第一个人随机到50元那么剩余金额是100-50 50 元。第二个人的随机范围是 (0 50元)平均可以抢到25元。假设第二个人随机到25元那么剩余金额是50-25 25 元。第三个人的随机范围是 (0 25元)平均可以抢到12.5元。以此类推每一次随机范围越来越小。方法1二倍均值法剩余红包金额为M剩余人数为N那么有如下公式每次抢到的金额 随机区间 (0 M / N X 2)这个公式保证了每次随机金额的平均值是相等的不会因为抢红包的先后顺序而造成不公平。举个栗子假设有10个人红包总额100元。100/10X2 20, 所以第一个人的随机范围是(020 )平均可以抢到10元。假设第一个人随机到10元那么剩余金额是100-10 90 元。90/9X2 20, 所以第二个人的随机范围同样是(020 )平均可以抢到10元。假设第二个人随机到10元那么剩余金额是90-10 80 元。80/8X2 20, 所以第三个人的随机范围同样是(020 )平均可以抢到10元。以此类推每一次随机范围的均值是相等的。//发红包算法金额参数以分为单位public static List divideRedPackage(Integer totalAmount, Integer totalPeopleNum){List amountList new ArrayList();Integer restAmount totalAmount;Integer restPeopleNum totalPeopleNum;Random random new Random();for(int i0; i//随机范围[1剩余人均金额的两倍)左闭右开int amount random.nextInt(restAmount / restPeopleNum * 2 - 1) 1;restAmount - amount;restPeopleNum --;amountList.add(amount);}amountList.add(restAmount);return amountList;}public static void main(String[] args){List amountList divideRedPackage(5000, 30);for(Integer amount : amountList){System.out.println(抢到金额 new BigDecimal(amount).divide(new BigDecimal(100)));}}程序输出结果如下抢到金额2.92抢到金额1.48抢到金额3.05抢到金额0.53抢到金额0.45抢到金额1.36抢到金额1.02抢到金额1.99抢到金额1.3抢到金额0.48抢到金额0.83抢到金额2.89抢到金额0.94抢到金额2.11抢到金额3.13抢到金额0.91抢到金额2.64抢到金额2.02抢到金额2.88抢到金额1.13抢到金额2.09抢到金额1.37抢到金额2.41抢到金额2.13抢到金额1.32抢到金额0.44抢到金额1.62抢到金额1.89抢到金额2.23抢到金额0.44方法2线段切割法何谓线段切割法我们可以把红包总金额想象成一条很长的线段而每个人抢到的金额则是这条主线段所拆分出的若干子线段。如何确定每一条子线段的长度呢由“切割点”来决定。当N个人一起抢红包的时候就需要确定N-1个切割点。因此当N个人一起抢总金额为M的红包时我们需要做N-1次随机运算以此确定N-1个切割点。随机的范围区间是(1 M)。当所有切割点确定以后子线段的长度也随之确定。这样每个人来抢红包的时候只需要顺次领取与子线段长度等价的红包金额即可。这就是线段切割法的思路。在这里需要注意以下两点1.当随机切割点出现重复如何处理。2.如何尽可能降低时间复杂度和空间复杂度。