发红包公平算法

微信随机红包算法

注意1:保证随机公平性。要和先后随机无关,即每随机者的红包收益期望和分布是一致的
注意2:保证钱的精确度为 “分 ” (即 0.01元)。在分取整的过程中公平性不能变化。
扩展:假设每人致少分得0.01元怎么处理

// 解决的思路就是个人随机权值 ,每个人分的比例等于自己权值比上总权值
//以下是伪代码写下思路
用户个数 =10 //用户的个数 初始化为10人
总钱数 = 10000 //需要分的钱数这里以分为单位 10000即100元
权值数组[用户个数] //存储用户分钱比重
用户分钱整数部分数组[用户个数] //用户分得的钱数整数部分(即整数分)
用户分钱小数部分数组[用户个数] //用于处理整数分钱后的余额 存贮为小数部分余额(即小于分的单位)
临时变量权值和 = 0
for (i=1,i<用户个数 )
{
权值数组[用户个数] = random(0 ,1) //随机给每个抢红包用户分配权值
权值和 += 权值数组[i] // 在这里算下权值的和 顺便累加下
}
余额 = 总钱数 //用户根据随机权值分配后取整 剩下的及是余额 即不能精确到分(0.01元)的数
for (i=1,i<用户个数 )//根据每个人权值
{
用户分得钱数 = 100 * 权值数组[i] /权值和
用户分钱整数部分数组[i] = 取整(用户分得钱数 精确到分的 )
用户分钱小数部分数组[i] = 取小数( 用户分得钱数 分以下的)
余额 = 余额 - 用户分钱数组的整数部分 //为节省效率 在这里统计下余额
}

//分配余额 根据用户分钱小数部分数组进行排序 排序靠前的人分得1分钱 这里不详细写了

//扩展那个 每个用户至少分0.01元, 相当于每人先发1分钱, 然后剩下的99.9元随机分配。即上面算法,只是变量修改。

你可能感兴趣的:(算法,算法,微信游戏)