我了解從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中文網其他相關文章!