面试官:给我发个红包
在各种庆祝场合,发红包是我国一项广受欢迎的传统习俗,象征着好运与祝福。随着技术的发展,电子红包成为了流行趋势,尤其在社交软件上,而实现一个既公平又有趣的红包分配算法就成了技术领域的一个小挑战。下面,我们来探讨一个简单的随机红包算法,它旨在保持分配的趣味性同时确保每个人都能获得一定的金额。
算法概述
实现了一个基本的随机红包算法,其核心目标是在给定的总金额(total
)和人数(num
)条件下,生成一个数组,数组中的每个元素代表一个人应得的红包金额。算法的关键要求是所有红包金额之和等于初始总金额,并且每个红包的最小值为0.01,以此确保分配的公平性和实际操作的可能性。
/*
* @func 红包算法
* @param {number}total金额
* @param {number}num 人数
*/
function hongbao(total, num) {
}
算法步骤解析
-
初始化:首先,创建一个空数组
arr
用于存储每个人分到的红包金额。同时,定义两个变量restAmount
表示剩余总金额(初始时等于total
),restNum
表示还未分配红包的人数(即num
)。const arr=[]; //余额 let restAmount=total // 未领取人数 let restNum=num
-
循环分配:通过一个循环,对除最后一人外的所有人进行红包分配。循环执行
num-1
次,每次循环:for (let i=0; i<num-1; i++) { let amount=parseFloat(Math.random()*(restAmount/restNum*2)).toFixed(2); restAmount-=amount; restNum--; arr.push(amount) }
- 计算一个随机金额
amount
。这里采用了(restAmount/restNum*2)
作为随机范围的上限,乘以2是为了增加分配的随机性和趣味性,使得红包大小有更大的波动空间(0.01到平均值的2倍)。 - 使用
parseFloat
和toFixed(2)
确保计算结果为保留两位小数的浮点数,符合最小单位为0.01的要求。 - 更新剩余金额
restAmount
和未分配人数restNum
。 - 将每次循环的结果放入数组中
- 计算一个随机金额
-
处理最后一份:循环结束后,将剩余的全部金额直接分配给最后一人,并加入到数组中。这样可以确保所有金额被完全分配出去,且满足金额总和等于最初设定的总金额。
arr.push(restAmount.toFixed(2))
-
返回结果:最后,函数返回包含每个人所得红包金额的数组。
return arr
红包的结果
每次结果都不一样,OK的,以后回家发红包用自己写的
结论
红包算法融合了数学、概率论和编程技巧,旨在创造一个既公平又充满乐趣的虚拟红包分配体验。通过不断优化算法细节,可以在保持分配公平的基础上,提升用户领取红包时的惊喜感和满意度。无论是节日庆典还是在线活动,一个精心设计的红包算法都是增强用户互动和情感联系的有效工具。
快去试试吧🥰,别忘了给家人发一个哦
转载自:https://juejin.cn/post/7377957237622538290