github.com/evolutionlandorg/raffle/algorithm@v0.0.0-20210909083243-054e780956f1/README.md (about) 1 # Raffle 2 权重随机算法,从不同权重的N个元素中随机选择一个,并使得总体选择结果是按照权重分布的。 3 如有4个元素A、B、C、D,权重分别为1、2、3、4,随机结果中A:B:C:D的比例要为1:2:3:4。 4 累加每个元素的权重A(1)-B(3)-C(6)-D(10),则4个元素的的权重管辖区间分别为(0,1]、(1,3]、(3,6]、(6,10]。然后随机出一个(0,10)之间的随机数。落在哪个区间,则该区间之后的元素即为按权重命中的元素。 5 利用treemap,则构造出的一个树为: 6 ``` 7 B(3) 8 / \ 9 / \ 10 A(1) D(10) 11 / 12 / 13 C(6) 14 ``` 15 利用treemap.Ceiling即可找到元素. 16 17 ## 性能 18 4个元素A、B、C、D,其权重分别为1、2、3、4,采样100w个块哈希,抽取1个中奖元素,抽取运行100w次,结果如下: 19 | 元素 | 命中次数 | 误差率 | 20 | ---- | -------- |------- | 21 | A | 99865 | 0.01% | 22 | B | 200092 | 0.01% | 23 | C | 299675 | 0.03% | 24 | D | 400368 | 0.03% |