登录
首页 >  Golang >  Go问答

在 Go 中实现数组随机输出顺序的算法

来源:stackoverflow

时间:2024-02-07 23:30:24 448浏览 收藏

IT行业相对于一般传统行业,发展更新速度更快,一旦停止了学习,很快就会被行业所淘汰。所以我们需要踏踏实实的不断学习,精进自己的技术,尤其是初学者。今天golang学习网给大家整理了《在 Go 中实现数组随机输出顺序的算法》,聊聊,我们一起来看看吧!

问题内容

这个问题与大量重复答案之间的主要区别在于,输入数组很短,只有 3 个元素。 --

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

  • 使用python,如何以随机顺序输出列表?答案是random.shuffle
  • 使用 go,https://yourbasic.org/golang/shuffle-slice-array/,答案应该是 rand.shuffle

但是,这是我的代码:

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]

这似乎不是很随机。

对于短的三元素数组有更好的随机化有什么好主意吗?

顺便说一句,

  • 如何使用 vhdl 以随机顺序输出数组元素说使用线性反馈移位寄存器,但我认为这对于这个问题来说不是一个好主意。
  • 如何随机化(打乱)javascript 数组?给出了 durstenfeld 洗牌算法,fisher-yates 的优化版本.但我认为它的结果将与 go 的 rand.shuffle 非常相似。是吗?

正确答案


random.seed 从随机播放函数移至主函数。每个程序只能进行一次 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]

理论要掌握,实操不能落!以上关于《在 Go 中实现数组随机输出顺序的算法》的详细介绍,大家都掌握了吧!如果想要继续提升自己的能力,那么就来关注golang学习网公众号吧!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>