首頁  >  文章  >  後端開發  >  如何使用 Go 從切片中隨機選擇一個偏向切片一端的項目?

如何使用 Go 從切片中隨機選擇一個偏向切片一端的項目?

王林
王林轉載
2024-02-05 23:12:121008瀏覽

如何使用 Go 从切片中随机选择一个偏向切片一端的项目?

問題內容

我了解從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://www.php.cn/link/34ff028fc02b773b8885b59aee142e60

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://www.php.cn/link/d5c82d99f0edb85fc94ffa4204146aad

#
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]

以上是如何使用 Go 從切片中隨機選擇一個偏向切片一端的項目?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:stackoverflow.com。如有侵權,請聯絡admin@php.cn刪除