最新公告
  • 欢迎您光临码农资源网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!加入我们
  • Go 中短数组的输出顺序随机化的算法

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

    php小编小新为大家带来了一篇关于Go语言中短数组输出顺序随机化的算法的文章。在Go语言中,短数组的输出顺序是不确定的,这是由于Go语言的并发特性所导致的。文章将介绍一种基于随机数生成器的算法,可以实现对短数组输出顺序的随机化,让程序执行时每次输出的顺序都不同,增加程序的灵活性和变化性。通过阅读本文,读者可以了解到如何在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]
    
    想要了解更多内容,请持续关注码农资源网,一起探索发现编程世界的无限可能!
    本站部分资源来源于网络,仅限用于学习和研究目的,请勿用于其他用途。
    如有侵权请发送邮件至1943759704@qq.com删除

    码农资源网 » Go 中短数组的输出顺序随机化的算法
    • 20会员总数(位)
    • 16171资源总数(个)
    • 1195本周发布(个)
    • 0 今日发布(个)
    • 115稳定运行(天)

    提供最优质的资源集合

    立即查看 了解详情