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

Pengedaran seragam berbanding shuffling naif?

王林
王林ke hadapan
2024-02-09 08:30:09859semak imbas

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)
    }

}

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

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

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

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!

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