实现不同概率对应不同level思路

发布时间 2023-11-16 16:51:08作者: zuzeep

背景


现在我要实现一个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

这里可以看到只需要随机一次,通过随机数二进制的长度来确定level