登录
首页 >  Golang >  Go问答

在 Golang 中如何随机选择一个倾向于切片一端的项目?

来源:stackoverflow

时间:2024-03-03 08:54:25 353浏览 收藏

Golang不知道大家是否熟悉?今天我将给大家介绍《在 Golang 中如何随机选择一个倾向于切片一端的项目?》,这篇文章主要会讲到等等知识点,如果你在看完本篇文章后,有更好的建议或者发现哪里有问题,希望大家都能积极评论指出,谢谢!希望我们能一起加油进步!

问题内容

我了解从 go 中的 slice 中选择随机值的一种方法:

rand.Seed(time.Now().UTC().UnixNano())     
                                                
var db [500]string                         
log.Println(db[rand.Intn(len(db))])

但是我如何从 slice 中选择一个随机项目,并偏向 slice 的一端?对于我的用例,我将拥有一个 slice,它使用 append() 随着时间的推移而增长。我的理解是,最新的项目将添加到 slice 的右侧。我想创建一个函数,从 slice 中选择一个随机项目,并偏向 slice 的最新成员。我的第一个猜测是通过 rand.normfloat64() 使用 正态分布 ,但我不确定如何或是否可以使用它来实现此目的。

该函数应该能够从 slice 中选取任何项目,但应该以更高的频率选取添加到 slice 的新项目。


正确答案


假设您对正态分布感到满意,则可以使用 rand.normfloat64()。如果您的数组有 20 个项目:

int(math.abs(rand.normfloat64())*10) % 20

将生成向列表开头加权的数字。并且

20 - int(math.abs(rand.normfloat64())*10) % 20

将生成向列表末尾加权的数字。

这是一个演示样本随机分布的示例。 移动游乐场:https://go.dev/play/p/awepezqo7p8

package main

import (
    "fmt"
    "math"
    "math/rand"
)
func main() {
    var buckets [20]int
    for i := 0; i < 1000; i++ {
        r := int(math.abs(rand.normfloat64())*10) % 20
        buckets[r]++
    }
    fmt.println(buckets)
}

示例输出:

[86 92 76 80 73 69 60 69 58 51 47 38 44 30 29 24 19 27 18 10]

虽然它是随机的,所以你仍然可以获得所有尾部物品......

如果您想要一个阶跃函数,其中前半部分的数字是左半部分数字的 10 倍,只需使用两个随机数即可。

n := rand.intn(10)
if rand.float64() < 0.1 {
    n = n + 10
}

go playground 示例:https://go.dev/play/p/citushmwqez

package main

import (
    "fmt"
    "math/rand"
)

func main() {
    var buckets [20]int
    for i := 0; i < 1000; i++ {
        r := rand.Intn(10)
        if rand.Float64() < 0.1 {
            r = r + 10
        }
        buckets[r]++
    }
    fmt.Println(buckets)
}

示例输出

[96 92 89 89 88 78 95 86 83 98 15 10 15 10 10 12 4 11 11 8]

今天关于《在 Golang 中如何随机选择一个倾向于切片一端的项目?》的内容介绍就到此结束,如果有什么疑问或者建议,可以在golang学习网公众号下多多回复交流;文中若有不正之处,也希望回复留言以告知!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>