根据官方给出的状元签概率模拟NBA选秀顺位

首先恭喜马刺队抽中了状元签,这下文班亚马跑不脱了。未来都是他们的。

对这个选秀顺序突然有点兴趣,想想应该怎么去实现它。根据官方给出的状元签概率模拟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)
    }
}

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注