抢红包的大小是由算法决定的?如果是你来写,你要公平还是刺激?

今天我们来聊一个比较生活化的主题。
要说数字时代给我们生活带来的变化,红包的呈现形式一定是其中之一。
如今,红包不再局限于传统的纸质红包,而是成为一种流行的社交互动方式,广泛应用于各种场景,例如春节微信抢红包、生日聚会分配小礼物等等。
那么问题来了,如何设计一个既公平又有趣的红包算法怎么把一笔钱公平又有趣地分给大家呢?
01
红包算法的基本要求
一般爱说,设计红包算法,需要满足以下几个基本要求👇
1. 公平性
每个参与者都应该有机会获得红包,且红包金额不能为负。这确保了参与者之间的公平竞争,避免出现“一人独大”的情况。
2. 随机性
红包金额应该具有一定的随机性,避免总是固定的数额,增加抢红包的乐趣和刺激感。
3. 不可预测性
领取红包的顺序可能会影响金额,但不能完全由顺序决定,保证每个人都有惊喜感,避免“先到先得”的模式。
4. 总金额控制
红包的总金额是固定的,不能多也不能少,确保预算控制,避免出现“超支”的情况。
02
线性切割法:一个区间切N-1刀
线性切割法是最简单的红包算法之一,它将红包金额看作一条线段,然后在上面随机切割出多个小段,每个小段代表一个红包的金额。
具体步骤如下👇
1.确定总金额和人数
假设总金额为M,需要分给N个人。
2.随机选取切割点
在区间[0, M]中随机选择N-1个切割点,将线段分割成N段。
3.排序切割点
将切割点按照从小到大的顺序排序。
4.分配红包金额
每个红包的金额由相邻两个切割点之间的距离决定,越早被切割出来的段可能越大。
示例代码 (Java)
运行结果
假设总金额是100元,分5个人,那么可能的分配结果是:
这种方法的算法相对简单,易于实现;并且随机性强,每个红包的金额都有可能不同,增加抢红包的刺激感。
但也有缺点,红包金额与切割点的位置强相关,可能导致部分红包过大或过小,分配不均匀,影响用户体验。
03
二倍均值法:更为均匀的红包分配
二倍均值法在保证红包金额分布更加均匀的同时,保留一定的随机性。
它的算法核心是,每次分配红包时,都保证剩余金额不会因为一次过大的分配而耗尽。这一方法的公式为:
具体步骤如下👇
1.初始化
设定总金额为M,总人数为N。
2.循环分配
每次分配时,剩余金额为当前剩余金额,剩余人数为当前剩余人数。
3.随机生成红包金额
在[0, 剩余金额/剩余人数*2]范围内随机生成一个数作为当前红包的金额。
4.更新剩余金额和剩余人数
减去当前分配的红包金额,剩余人数减少1。
5.分配到最后一个人
由于分配范围的控制,最后一个红包的金额不会过大或过小。
示例代码 (Java)
运行结果
同样的总金额100元,分5个人,可能的分配结果是:
虽然二倍均值法依然会出现“手气王”和“手气差”的情况,但程度比线性切割法更轻微,不对相对的惊喜感也就更弱一些。
在设计红包算法时,我们可以根据实际需求选择合适的方案。
更注重随机性和惊喜感,就选择线性切割法。更注重公平性和均匀性,则选择二倍均值法。
红包算法看似简单,但它在保证公平、随机和不可预测性的同时,还需要考虑到体验感。这两种方法各有优势,适用于不同的场景~