0

0

Go 语言中高效打乱数组的指南

聖光之護

聖光之護

发布时间:2025-09-15 23:04:01

|

826人浏览过

|

来源于php中文网

原创

go 语言中高效打乱数组的指南

本文旨在介绍在 Go 语言中如何高效地打乱数组(或切片)的顺序。 重点讲解了 Fisher-Yates shuffle 算法的 Go 语言实现,并提供了避免额外内存分配的优化方案。通过示例代码和详细解释,帮助开发者掌握在 Go 语言中实现数组随机排序的技巧,并理解其背后的原理。

在 Go 语言中,并没有像 Python 那样内置的 shuffle 函数来直接打乱数组的顺序。 然而,我们可以利用 Go 语言的特性,结合经典的 Fisher-Yates shuffle 算法,实现高效且简洁的数组打乱功能。

Fisher-Yates Shuffle 算法

Fisher-Yates shuffle 算法是一种经过验证的随机排列算法,它能够保证数组中的每个元素被放置在每个位置的概率相等,从而实现真正的随机打乱。 该算法的基本思想是从数组的最后一个元素开始,依次与前面的随机位置的元素进行交换。

Go 语言实现

以下是在 Go 语言中实现 Fisher-Yates shuffle 算法的示例代码:

package main

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

func shuffle(slice []int) {
    rand.Seed(time.Now().UnixNano()) // 使用当前时间作为随机数种子

    for i := range slice {
        j := rand.Intn(i + 1)
        slice[i], slice[j] = slice[j], slice[i]
    }
}

func main() {
    list := []int{}
    for i := 1; i <= 25; i++ {
        list = append(list, i)
    }
    fmt.Println("Original list:", list)

    shuffle(list)
    fmt.Println("Shuffled list:", list)
}

代码解释:

WPS AI
WPS AI

金山办公发布的AI办公应用,提供智能文档写作、阅读理解和问答、智能人机交互的能力。

下载
  1. rand.Seed(time.Now().UnixNano()): 这行代码至关重要,它使用当前时间作为随机数生成器的种子。 如果不设置种子,每次运行程序生成的随机序列将会相同,导致打乱结果的可预测性。 使用 time.Now().UnixNano() 可以确保每次运行程序时都使用不同的种子,从而产生不同的随机序列。
  2. for i := range slice: 这个循环遍历切片中的每个元素,i 代表当前元素的索引。
  3. j := rand.Intn(i + 1): 这行代码生成一个 0 到 i (包括 i) 之间的随机整数 j。 rand.Intn(n) 函数返回一个范围在 [0, n) 的非负伪随机整数。
  4. slice[i], slice[j] = slice[j], slice[i]: 这行代码交换切片中索引为 i 和 j 的元素的值。 这是 Go 语言中一种简洁的交换变量值的写法,避免了使用临时变量。

运行结果示例:

Original list: [1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25]
Shuffled list: [2 19 14 8 13 9 21 11 1 18 17 24 12 5 16 25 3 22 20 4 15 23 6 10 7]

避免额外内存分配

上述实现直接在原切片上进行操作,无需创建额外的切片,从而避免了额外的内存分配,提高了效率。

注意事项

  • 随机数种子: 务必设置随机数种子,以确保每次运行程序时都能生成不同的随机序列。
  • 切片 vs. 数组: 上述代码使用的是切片 (slice),因为切片的长度是可变的,更适合动态数据的处理。 如果你使用的是固定长度的数组,你需要先将其转换为切片才能使用上述算法。
  • 数据类型: 上述代码示例中使用了 int 类型的切片。 你可以根据实际需求修改代码,使其支持其他数据类型的切片,例如 string、float64 等。

总结

通过本文的介绍,你已经掌握了在 Go 语言中实现高效数组打乱的方法。 Fisher-Yates shuffle 算法是一种简单而强大的算法,能够保证随机性,并且可以直接在原切片上进行操作,避免了额外的内存分配。 在实际开发中,你可以根据具体的需求,灵活运用这些技巧,实现各种各样的随机化功能。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
数据类型有哪几种
数据类型有哪几种

数据类型有整型、浮点型、字符型、字符串型、布尔型、数组、结构体和枚举等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

310

2023.10.31

php数据类型
php数据类型

本专题整合了php数据类型相关内容,阅读专题下面的文章了解更多详细内容。

222

2025.10.31

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

463

2023.08.02

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

463

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

544

2024.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

113

2025.08.29

C++中int的含义
C++中int的含义

本专题整合了C++中int相关内容,阅读专题下面的文章了解更多详细内容。

200

2025.08.29

go语言 数组和切片
go语言 数组和切片

本专题整合了go语言数组和切片的区别与含义,阅读专题下面的文章了解更多详细内容。

46

2025.09.03

C++ 设计模式与软件架构
C++ 设计模式与软件架构

本专题深入讲解 C++ 中的常见设计模式与架构优化,包括单例模式、工厂模式、观察者模式、策略模式、命令模式等,结合实际案例展示如何在 C++ 项目中应用这些模式提升代码可维护性与扩展性。通过案例分析,帮助开发者掌握 如何运用设计模式构建高质量的软件架构,提升系统的灵活性与可扩展性。

14

2026.01.30

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.4万人学习

Django 教程
Django 教程

共28课时 | 3.7万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号