首先恭喜马刺队抽中了状元签,这下文班亚马跑不脱了。未来都是他们的。
对这个选秀顺序突然有点兴趣,想想应该怎么去实现它。根据官方给出的状元签概率模拟NBA选秀顺位的思路是:首先定义了一个Team结构体,包含了球队的名称和抽中状元签的概率。注意这里我们将概率扩大了100倍,变成了整数,便于计算。接着初始化了一个随机数生成器,然后创建了两个数组:一个代表球队,一个代表对应的抽签概率。然后生成一个范围在[0, sumProbs)的随机数,依次减去每个球队的抽签概率,当结果小于0时,对应的球队就被抽中。这样可以确保每个球队被抽中的概率与其抽签概率一致。
需要注意的是,这里的概率是整数,所以如果概率是小数,可以将它们转换为整数。例如,如果概率是0.14,可以将所有的概率乘以100,转换为整数14。
package main
import (
"fmt"
"math/rand"
"time"
)
type Team struct {
name string
prob int
}
func remove(slice []*Team, i int) []*Team {
return append(slice[:i], slice[i+1:]...)
}
func weightedRandom(teams []*Team) (picked *Team, rest []*Team) {
var total int
for _, t := range teams {
total += t.prob
}
rand.Seed(time.Now().UnixNano())
r := rand.Intn(total)
for i, t := range teams {
r -= t.prob
if r < 0 {
return t, remove(teams, i)
}
}
return teams[0], remove(teams, 0)
}
func main() {
teams := []*Team{
{"活塞", 1400},
{"火箭", 1400},
{"马刺", 1400},
{"黄蜂", 1250},
{"开拓者", 1050},
{"魔术", 900},
{"步行者", 680},
{"奇才", 670},
{"爵士", 450},
{"独行侠", 300},
{"公牛", 180},
{"雷霆", 170},
{"猛龙", 100},
{"鹈鹕", 50},
//其他未列出的队伍我们给予最低的概率
{"老鹰", 1}, {"凯尔特人", 1}, {"篮网", 1}, {"湖人", 1}, {"灰熊", 1},
{"热火", 1}, {"雄鹿", 1}, {"森林狼", 1}, {"尼克斯", 1}, {"国王", 1},
{"76人", 1}, {"太阳", 1}, {"骑士", 1}, {"掘金", 1}, {"勇士", 1}, {"快船", 1},
}
for i := 0; len(teams) > 0; i++ {
var picked *Team
picked, teams = weightedRandom(teams)
fmt.Printf("第%d顺位球队是:%s\n", i+1, picked.name)
}
}