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

r3i60tvu  于 2023-04-03  发布在  Go
关注(0)|答案(1)|浏览(142)
  • 这个问题和大量重复答案的关键区别在于,输入数组很短,只有3个元素。* --

假设我有一个int的有序集合。数组的大小只有3(或更多)。我需要随机化它们的顺序并返回一个新数组。虽然这是一个纯算法问题,但首选的答案语言是Go。

这是我的代码:
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] })
}

这是我的一个测试结果:

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

这看起来并不是随机的。
有什么好主意可以更好地随机化一个短的3元素数组吗?
顺便说一句

col17t5w

col17t5w1#

random.Seed从shuffle函数移到main函数。每个程序只能执行一次PRNG的种子操作,成功的随机性模拟是通过生成器的状态转换而不是种子操作完成的。除非您真正了解PRNG的工作原理,并且出于可重复性等原因试图显式控制该过程,否则不要重新执行种子操作。
下面对代码的简单修改应该可以满足您的需求:

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

这会产生以下结果:

[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]

相关问题