背景
现在我要实现一个level,有1/2概率level=1,1/4概率level=2,1/8概率level=3。。。。
典型应用跳表中的randomLevel,这里提供两种实现思路
随机累加
简单点多次循环随机,小于1/2则level+1
level = 1
while (rand.float(0,1) < 0.5){
level++
}
这里有几个缺点
- rand.float(0,1)要保证线程安全,需要加锁, 多次随机,影响性能
- 没有加中断操作,可能造成程序崩溃
随机区间
随机区间利用的是随机的数据在某个范围内的概率,比如随机一个016的数据,落在815概率为1/2,48为1/4,24为1/8,如此往复
具体看伪代码
levelMax = 4
// 随机一个0~2^levelMax的数字
randNum = rand.int(0, math.pow(2,levelMax))
randLen = bin(randNum).length
level = levelMax - randLen + 1
标签:rand,概率,level,不同,float,levelMax,随机,思路 From: https://www.cnblogs.com/zuzeep/p/17836698.html这里可以看到只需要随机一次,通过随机数二进制的长度来确定level