Rumah > pembangunan bahagian belakang > Golang > Pengedaran seragam berbanding shuffling naif?

Pengedaran seragam berbanding shuffling naif?

王林
Lepaskan: 2024-02-09 08:30:09
ke hadapan
909 orang telah melayarinya

Pengedaran seragam berbanding shuffling naif?

Penyunting PHP Xiaoxin akan mendedahkan hubungan antara "pengedaran seragam dan shuffling naif". Dalam sains komputer, shuffling ialah operasi penting yang sering digunakan untuk merawak data atau koleksi. Taburan seragam bermaksud taburan nombor rawak adalah purata dalam julat tertentu. Jadi, bolehkah merombak memastikan pengedaran sekata? Jawapannya tidak mudah, jadi mari kita terokai soalan ini bersama-sama.

Kandungan soalan

Saya merombak tatasusunan 3 int sebanyak 6 juta kali. Saya merekodkan setiap pilih atur tatasusunan dalam peta. Di bawah ialah kod menggunakan go.

package main

import (
    "fmt"
    "math/rand"
    "time"
)

func randrange(min, max int) int {
    return rand.intn(max-min+1) + min
}

func naiveshuffle(arr *[3]int) {
    for i := 0; i < 3; i++ {
        e := randrange(0, 2)
        arr[e], arr[i] = arr[i], arr[e]
    }
}

func main() {
    rand.seed(time.now().unixnano())
    m := make(map[[3]int]int, 6)
    arr := [3]int{-6,10,184}

    for i := 1; i <= 6000000; i++ {
        a := arr
        naiveshuffle(&arr)
        m[a]++
    }

    for k, v := range m {
        fmt.println(k, ":", v)
    }

}
Salin selepas log masuk

Memandangkan saya melakukan shuffle mudah, pemahaman saya ialah ia tidak sepatutnya tidak menghasilkan pilih atur teragih sama rata. Tetapi inilah yang saya dapat:

[184 -6 10] : 1000074
[184 10 -6] : 1000764
[-6 10 184] : 1000766
[10 184 -6] : 998090
[-6 184 10] : 1000479
[10 -6 184] : 999827
Salin selepas log masuk

Ini menunjukkan bahawa setiap satu daripada 6 pilih atur yang mungkin berlaku kira-kira 1 juta kali. Mengapa pengedaran yang saya dapat kelihatan seragam?

EDIT: Kod ditukar kepada hanya benih sekali. Saya kini mendapat:

[-6 184 10] : 999507
[184 -6 10] : 1000401
[10 -6 184] : 1002163
[10 184 -6] : 999236
[-6 10 184] : 999016
[184 10 -6] : 999677
Salin selepas log masuk

Sunting 2: Terima kasih kepada Hobbs, saya sedar saya melakukan kesilapan bodoh. Saya patut kocok a,而不是 arr. Saya kini mendapat:

[10 -6 184] : 1111056
[-6 10 184] : 888442
[184 -6 10] : 888576
[10 184 -6] : 1109896
[-6 184 10] : 1113148
[184 10 -6] : 888882
Salin selepas log masuk

Penyelesaian

Anda mengocok arr lebih 6 juta kali tanpa memulihkannya kepada keadaan asalnya antara shuffle - dengan kata lain, 6 juta percubaan anda tidak bebas The . Walaupun pilih atur setiap shuffle diagihkan secara tidak sekata, susun atur ini di atas satu sama lain sebanyak 6 juta kali menghasilkan taburan yang sangat hampir dengan seragam.

Atas ialah kandungan terperinci Pengedaran seragam berbanding shuffling naif?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
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