Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk memilih item secara rawak daripada kepingan yang berat sebelah ke arah satu hujung kepingan menggunakan Go?

Bagaimana untuk memilih item secara rawak daripada kepingan yang berat sebelah ke arah satu hujung kepingan menggunakan Go?

王林
王林ke hadapan
2024-02-05 23:12:121008semak imbas

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

Kandungan soalan

Saya faham cara untuk memilih nilai rawak daripada go 中的 slice:

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

Tetapi bagaimana saya boleh mendapatkan ini daripada slice 中选择一个随机项目,并偏向 slice 的一端?对于我的用例,我将拥有一个 slice,它使用 append() 随着时间的推移而增长。我的理解是,最新的项目将添加到 slice 的右侧。我想创建一个函数,从 slice 中选择一个随机项目,并偏向 slice 的最新成员。我的第一个猜测是通过 rand.normfloat64() 使用 正态分布 , tetapi saya tidak pasti bagaimana atau sama ada saya boleh menggunakannya untuk mencapai ini.

Fungsi ini sepatutnya boleh memuatkan item baru dari slice 中选取任何项目,但应该以更高的频率选取添加到 slice.


Jawapan betul


Dengan mengandaikan anda berpuas hati dengan pengedaran normal, anda boleh menggunakan rand.normfloat64(). Jika tatasusunan anda mempunyai 20 item:

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

Akan menjana nombor berwajaran ke arah permulaan senarai. Dan

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

akan menjana nombor berwajaran menjelang akhir senarai.

Ini adalah contoh yang menunjukkan pengedaran sampel secara rawak. Taman permainan mudah alih: 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)
}

Sampel output:

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

Ia adalah secara rawak, jadi anda masih boleh mendapatkan semua item ekor...

Jika anda mahukan fungsi step di mana nombor pada separuh pertama adalah 10 kali ganda nombor di separuh kiri, hanya gunakan dua nombor rawak.

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

pergi contoh taman permainan: 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)
}

Contoh output

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

Atas ialah kandungan terperinci Bagaimana untuk memilih item secara rawak daripada kepingan yang berat sebelah ke arah satu hujung kepingan menggunakan Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam