一個帶有權重的隨機選擇器

qiuker521發表於2019-04-23

隨便寫了一個帶有權重的隨機選擇器,test已經跑過了,但是還沒上線測試。

可以用來從幾個帶有權重的選項中選擇一個。

場景類似用來取nginx的upstream、 用來抽獎或者用來作弊。

package main

import (
    "log"

    "github.com/go-ego/murmur"
    "github.com/qiuker521/weightedrand"
)

func main() {
    log.Println("隨機選一個語言")
    選語言()
    log.Println("使用一致性hash作弊")
    一致性雜湊()
}
func 選語言() {
    c := weightedrand.Chooser{}
    var choices = []weightedrand.Choice{}
    choices = append(choices, weightedrand.Choice{"java", 0})
    choices = append(choices, weightedrand.Choice{"rust", 0})
    choices = append(choices, weightedrand.Choice{"python", 1})
    choices = append(choices, weightedrand.Choice{"go", 9})
    c.NewChooser(choices...)
    for i, v := range choices {
        log.Println("選項", i+1, ":", v.Item)
    }
    log.Println("我應該學", c.Pick(), "語言")
}

func 一致性雜湊() {
    c := weightedrand.Chooser{}
    var choices = []weightedrand.Choice{}
    choices = append(choices, weightedrand.Choice{"java", 1})
    choices = append(choices, weightedrand.Choice{"rust", 1})
    choices = append(choices, weightedrand.Choice{"python", 1})
    choices = append(choices, weightedrand.Choice{"go", 1})
    for i, v := range choices {
        log.Println("選項", i+1, ":", v.Item, "權重:", v.Weight)
    }

    c.NewChooser(choices...)
    var hash = "一致性雜湊永遠會選java"
    log.Println("然而事實上是:雖然不作弊,但是", hash)
    log.Println("不信的話我選擇給你看:", c.PickByHash(float64(murmur.Sum32(hash))))
}

執行結果:

2019/04/23 00:57:51 隨機選一個語言
2019/04/23 00:57:51 選項 1 : java
2019/04/23 00:57:51 選項 2 : rust
2019/04/23 00:57:51 選項 3 : python
2019/04/23 00:57:51 選項 4 : go
2019/04/23 00:57:51 我應該學 go 語言
2019/04/23 00:57:51 使用一致性hash作弊
2019/04/23 00:57:51 選項 1 : java 權重: 1
2019/04/23 00:57:51 選項 2 : rust 權重: 1
2019/04/23 00:57:51 選項 3 : python 權重: 1
2019/04/23 00:57:51 選項 4 : go 權重: 1
2019/04/23 00:57:51 然而事實上是:雖然不作弊,但是 一致性雜湊永遠會選java
2019/04/23 00:57:51 不信的話我選擇給你看: java

相關文章