Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Algoritma untuk rawak susunan output tatasusunan pendek dalam Go

Algoritma untuk rawak susunan output tatasusunan pendek dalam Go

WBOY
WBOYke hadapan
2024-02-15 12:57:08773semak imbas

Go 中短数组的输出顺序随机化的算法

Editor PHP Xiaoxin membawakan anda artikel tentang algoritma untuk rawak susunan output tatasusunan pendek dalam bahasa Go. Dalam bahasa Go, tertib keluaran tatasusunan pendek tidak ditentukan, yang disebabkan oleh ciri konkurensi bahasa Go. Artikel ini akan memperkenalkan algoritma berdasarkan penjana nombor rawak, yang boleh merawak tertib keluaran tatasusunan pendek, supaya susunan keluaran berbeza setiap kali atur cara dilaksanakan, meningkatkan fleksibiliti dan kebolehubahan atur cara. Dengan membaca artikel ini, pembaca boleh belajar cara rawak susunan output tatasusunan pendek dalam bahasa Go dan menggunakannya pada projek mereka sendiri.

Kandungan soalan

Perbezaan utama antara soalan ini dan jawapan pendua yang banyak ialah tatasusunan input sangat pendek, hanya 3 elemen. --

Andaikan saya mempunyai set yang ditempah int. Saiz tatasusunan hanya 3 (atau lebih). Saya perlu merawak pesanan mereka dan mengembalikan tatasusunan baharu. Walaupun ia adalah soalan algoritma tulen, bahasa jawapan pilihan adalah pergi.

  • Menggunakan python, bagaimana untuk mengeluarkan senarai dalam susunan rawak? Jawapannya ialah random.shuffle.
  • Menggunakan go, https://yourbasic.org/golang/shuffle-slice-array/, jawapannya sepatutnya rand.shuffle.

Tetapi, inilah kod saya:

https://go.dev/play/p/cvu8_q96-9f

func randshuffle(a []int) {
    rand.seed(time.now().unixnano())
    rand.shuffle(len(a), func(i, j int) { a[i], a[j] = a[j], a[i] })
}

Berikut adalah keputusan salah satu larian ujian saya:

[2 1 3]
[1 3 2]
[2 1 3]
[2 1 3]
[1 3 2]
[1 2 3]
[2 3 1]

Ini nampaknya tidak begitu rawak.

Ada idea bagus untuk rawak yang lebih baik untuk tatasusunan tiga elemen pendek?

By the way,

  • Bagaimana untuk mengeluarkan elemen tatasusunan dalam susunan rawak menggunakan vhdl mengatakan untuk menggunakan daftar anjakan maklum balas linear, tetapi saya fikir itu bukan idea yang baik untuk masalah ini.
  • Bagaimana untuk rawak (shuffle) tatasusunan javascript? Memandangkan algoritma shuffling durstenfeld, versi fisher-yates yang dioptimumkan Tetapi saya rasa keputusannya akan sangat serupa dengan go's rand.shuffle. ya?

Penyelesaian

Alih random.seed daripada fungsi shuffle ke fungsi utama. Prng hanya boleh disemai sekali setiap program, dan peniruan kerawak yang berjaya dicapai melalui peralihan keadaan penjana dan bukannya benih. Jangan semai semula melainkan anda benar-benar memahami cara prng berfungsi dan cuba mengawal proses secara eksplisit atas sebab seperti kebolehulangan.

Pengubahsuaian ringkas berikut pada kod akan memenuhi keperluan anda:

package main

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

func main() {
    rand.seed(time.now().unixnano())

    a := []int{1, 2, 3}
    for i := 0; i < 10; i++ {
        randshuffle(a)
        fmt.println(a)
    }
}

func randshuffle(a []int) {
    rand.shuffle(len(a), func(i, j int) { a[i], a[j] = a[j], a[i] })
}

Ini akan menghasilkan keputusan berikut:

[2 3 1]
[3 1 2]
[2 1 3]
[2 3 1]
[1 2 3]
[1 3 2]
[1 2 3]
[3 1 2]
[3 2 1]
[2 3 1]

Atas ialah kandungan terperinci Algoritma untuk rawak susunan output tatasusunan pendek dalam 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