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

王林
Lepaskan: 2024-02-05 23:12:12
ke hadapan
1007 orang telah melayarinya

如何使用 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))])
Salin selepas log masuk

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
Salin selepas log masuk

Akan menjana nombor berwajaran ke arah permulaan senarai. Dan

20 - int(math.abs(rand.normfloat64())*10) % 20
Salin selepas log masuk

akan menjana nombor berwajaran menjelang akhir senarai.

Ini adalah contoh yang menunjukkan pengedaran sampel secara rawak. Taman permainan mudah alih: //m.sbmmt.com/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)
}
Salin selepas log masuk

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
}
Salin selepas log masuk

pergi contoh taman permainan: //m.sbmmt.com/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)
}
Salin selepas log masuk

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!

sumber:stackoverflow.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!