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% |