go语言生成随机数和随机字符串的实现方法
来到golang学习网的大家,相信都是编程学习爱好者,希望在这里学习Golang相关编程知识。下面本篇文章就来带大家聊聊《go语言生成随机数和随机字符串的实现方法》,介绍一下go语言随机数、随机字符串,希望对大家的知识积累有所帮助,助力实战开发!
生成随机数
随机数的生成是计算机科学的一个研究领域,同时也是一种艺术。这是因为计算机是纯粹的逻辑机器,所以使用计算机生成随机数异常困难!
你可以用 math/rand 包来生成随机数。开始生成随机数之前首先需要一个种子,种子用于整个过程的初始化,它相当重要。因为如果你每次都用同样的种子初始化,那么就总是会得到相同的随机数序列。这意味着每个人都可以重新生成同一个序列,那这个序列就根本不能再算是随机的了!
我们将用来生成随机数的程序名为 randomNumbers.go,下面分成四个部分进行介绍。这个程序需要几个参数,分别是生成随机数的下限、生成随机数的上限、生成随机数的数量。如果你还用了第四个命令参数,那么程序会将它作为随机数生成器的种子。在测试的时候,你就可以再次使用这个参数生成相同的数列。
程序的第一部分如下所示:
package main import ( "fmt" "math/rand" "os" "strconv" "time" ) func random(min, max int) int { return rand.Intn(max-min) + min }
random() 函数完成了所有的工作,它通过根据指定的范围调用 rand.Intn() 生成随机数。
这个命令行程序的第二部分如下:
func main() { MIN := 0 MAX := 100 TOTAL := 100 SEED := time.Now().Unix() arguments := os.Args
这一部分对程序中将会用到的变量进行了初始化。
randomNumbers.go 的第三部分包含如下的 Go 代码:
switch len(arguments) { case 2: fmt.Println("Usage: ./randomNumbers MIN MAX TOTAL SEED") MIN, _ = strconv.Atoi(arguments[1]) MAX = MIN + 100 case 3: fmt.Println("Usage: ./randomNumbers MIN MAX TOTAL SEED") MIN, _ = strconv.Atoi(arguments[1]) MAX, _ = strconv.Atoi(arguments[2]) case 4: fmt.Println("Usage: ./randomNumbers MIN MAX TOTAL SEED") MIN, _ = strconv.Atoi(arguments[1]) MAX, _ = strconv.Atoi(arguments[2]) TOTAL, _ = strconv.Atoi(arguments[3]) case 5: MIN, _ = strconv.Atoi(arguments[1]) MAX, _ = strconv.Atoi(arguments[2]) TOTAL, _ = strconv.Atoi(arguments[3]) SEED, _ = strconv.ParseInt(arguments[4], 10, 64) default: fmt.Println("Using default values!") }
switch 代码块背后的逻辑相对简单:根据命令行参数的数量决定程序中的参数是使用缺省的默认值还是使用用户提供的值。为了简化程序,strconv.Atoi() 和 strconv.ParseInt() 函数返回的 error 参数使用下划线字符接收,然后被忽略。如果是商业程序就千万不能忽略 strconv.Atoi() 和 strconv.ParseInt() 函数返回的 error 参数!
最后,使用 strconv.ParseInt() 对 SEED 变量赋新的值是因为 rand.Seed() 函数要求的参数类型是 int64。strconv.ParseInt() 的第一个参数是要解析的字符串,第二个参数是输出数的基数,第三个参数是输出数的位数。由于我们想要生成的是一个 64 位的十进制整数,所以使用 10 作为基数,使用 64 作为位数。注意,如果你想解析无符号的整数的话应该使用 strconv.ParseUint() 函数代替。
randomNumbers.go 的最后一部分是如下的 Go 代码:
rand.Seed(SEED) for i := 0; i除了使用 Unix 时间戳作为随机数生成器的种子,你还可以使用 /dev/random 这个系统设备。你可以在第 8 章“Go Unix系统编程”中了解 /dev/random 的相关内容。
执行 randomNumbers.go 将会生成如下输出:
$ go run randomNumbers.go 75 69 15 75 62 67 64 8 73 1 83 92 7 34 8 70 22 58 38 8 54 91 65 1 50 76 5 82 61 90 10 38 40 63 6 28 51 54 49 27 52 92 76 35 44 9 66 76 90 10 29 22 20 83 33 92 80 50 62 26 19 45 56 75 40 30 97 23 87 10 43 11 42 65 80 82 25 53 27 51 99 88 53 36 37 73 52 61 4 81 71 57 30 72 51 55 62 63 79 $ go run randomNumbers.go 1 3 2 Usage: ./randomNumbers MIN MAX TOTAL SEED 1 1 $ go run randomNumbers.go 1 3 2 Usage: ./randomNumbers MIN MAX TOTAL SEED 2 2 $ go run randomNumbers.go 1 5 10 10 3 1 4 4 1 1 4 4 4 3 $ go run randomNumbers.go 1 5 10 10 3 1 4 4 1 1 4 4 4 3如果你对随机数生成真的很有兴趣,那么你应该先读一下 Donald E.Knuth 写的 The Art of Computer Programming (Addison-Wesley Professional, 2011) 的第二卷。
如果需要用 Go 生成更安全的随机数的话,你可以使用 crypto/rand 包。这个包中实现了满足密码学安全的伪随机数生成器。你可以在 https://golang.org/pkg/crypto/rand/ 文档页面了解更多关于 crypto/rand 包的信息。
生成随机字符串
一旦你知道了计算机是如何呈现出单个字符,从随机数过渡到随机字符串就不难了。这一节将会介绍如何使用前一节中 randomNumbers.go 的代码生成难以猜出的密码。用于完成这个任务的 Go 程序叫做 generatePassword.go,下面将分四个部分进行介绍。这个程序只需要一个命令行参数,就是你需要生成的密码的长度。
generatePassword.go 的第一部分包含如下的 Go 代码:
package main import ( "fmt" "math/rand" "os" "strconv" "time" ) func random(min, max int) int { return rand.Intn(max-min) + min }generatePassword.go 的第二个代码段如下:
func main() { MIN := 0 MAX := 94 SEED := time.Now().Unix() var LENGTH int64 = 8 arguments := os.Arg我们只想得到可打印的 ASCII 字符,所以对生成随机数的范围进行了限制。ASCII 字符表中可打印的字符一共有 94 个。这意味着该程序生成的随机数的范围应该是从 0 到 94 且不包括 94。
generatePassword.go 的第三个代码段如下:
switch len(arguments) { case 2: LENGTH, _ = strconv.ParseInt(os.Args[1], 10, 64) default: fmt.Println("Using default values!") } rand.Seed(SEED)generatePassword.go 的最后一部分如下:
startChar := "!" var i int64 = 1 for { myRand := random(MIN, MAX) newChar := string(startChar[0] + byte(myRand)) fmt.Print(newChar) if i == LENGTH { break } i++ } fmt.Println() }startChar 参数保存了这个程序可以生成的第一个 ASCII 字符,也就是十进制 ASCII 值为 33 的感叹号。已知该程序生成的随机数小于 94,可以计算出生成的最大的 ASCII 值为 93 + 33,等于 126,也就是 ~ 的 ASCII 值。下面的输出是含有十进制数值的 ASCII 字符表:
The decimal set:
0 nul 1 soh 2 stx 3 etx 4 eot 5 enq 6 ack 7 bel
8 bs 9 ht 10 nl 11 vt 12 np 13 cr 14 so 15 si
16 dle 17 dc1 18 dc2 19 dc3 20 dc4 21 nak 22 syn 23 etb
24 can 25 em 26 sub 27 esc 28 fs 29 gs 30 rs 31 us
32 sp 33 ! 34 " 35 # 36 $ 37 % 38 & 39 '
40 ( 41 ) 42 * 43 + 44 , 45 - 46 . 47 /
48 0 49 1 50 2 51 3 52 4 53 5 54 6 55 7
56 8 57 9 58 : 59 ; 60 63 ?
64 @ 65 A 66 B 67 C 68 D 69 E 70 F 71 G
72 H 73 I 74 J 75 K 76 L 77 M 78 N 79 O
80 P 81 Q 82 R 83 S 84 T 85 U 86 V 87 W
88 X 89 Y 90 Z 91 [ 92 \ 93 ] 94 ^ 95 _
96 ` 97 a 98 b 99 c 100 d 101 e 102 f 103 g
104 h 105 i 106 j 107 k 108 l 109 m 110 n 111 o
112 p 113 q 114 r 115 s 116 t 117 u 118 v 119 w
120 x 121 y 122 z 123 { 124 | 125 } 126 ~ 127 del在你最喜欢的 Unix shell 中输入 man ascii 就能生成易读的 ASCII 字符表。
执行 generatePassword.go 并传入合适的命令行参数将生成如下输出:
$ go run generatePassword.go Using default values! ugs$5mv1 $ go run generatePassword.go Using default values! PA/8hA@? $ go run generatePassword.go 20 HBR+=3\UA'B@ExT4QG|o $ go run generatePassword.go 20 XLcr|R{*pX/::'t2u^T'终于介绍完啦!小伙伴们,这篇关于《go语言生成随机数和随机字符串的实现方法》的介绍应该让你收获多多了吧!欢迎大家收藏或分享给更多需要学习的朋友吧~golang学习网公众号也会发布Golang相关知识,快来关注吧!

- 上一篇
- Go中时间与时区问题的深入讲解

- 下一篇
- 使用Go实现TLS服务器和客户端的示例
-
- 沉默的老鼠
- 太全面了,码住,感谢博主的这篇文章内容,我会继续支持!
- 2023-04-21 03:28:47
-
- 愉快的外套
- 太详细了,收藏了,感谢老哥的这篇文章内容,我会继续支持!
- 2023-03-22 04:03:18
-
- 醉熏的大炮
- 真优秀,一直没懂这个问题,但其实工作中常常有遇到...不过今天到这,看完之后很有帮助,总算是懂了,感谢师傅分享博文!
- 2023-03-21 15:31:53
-
- 玩命的砖头
- 这篇文章内容太及时了,太细致了,感谢大佬分享,码起来,关注博主了!希望博主能多写Golang相关的文章。
- 2023-03-14 13:11:34
-
- 复杂的万宝路
- 很棒,一直没懂这个问题,但其实工作中常常有遇到...不过今天到这,看完之后很有帮助,总算是懂了,感谢楼主分享文章!
- 2023-03-11 04:07:24
-
- 文艺的西装
- 这篇技术贴真及时,太细致了,很好,码住,关注师傅了!希望师傅能多写Golang相关的文章。
- 2023-03-09 02:11:08
-
- 追寻的红牛
- 这篇文章太及时了,作者加油!
- 2023-02-15 09:38:48
-
- 含蓄的音响
- 赞 👍👍,一直没懂这个问题,但其实工作中常常有遇到...不过今天到这,帮助很大,总算是懂了,感谢up主分享技术贴!
- 2023-02-08 06:08:37
-
- 典雅的黑夜
- 这篇技术贴太及时了,太详细了,写的不错,已加入收藏夹了,关注作者大大了!希望作者大大能多写Golang相关的文章。
- 2023-01-22 02:49:18
-
- Golang · Go教程 | 28分钟前 |
- DebianSyslog在虚拟机中的实用攻略
- 467浏览 收藏
-
- Golang · Go教程 | 8小时前 |
- DebianOpenSSL安装失败的终极解决方案
- 501浏览 收藏
-
- Golang · Go教程 | 9小时前 |
- Debian数据快速提取技巧
- 216浏览 收藏
-
- Golang · Go教程 | 12小时前 |
- Debian系统JS依赖管理终极攻略
- 218浏览 收藏
-
- Golang · Go教程 | 14小时前 |
- Debian上Hadoop作业调度实用技巧
- 100浏览 收藏
-
- Golang · Go教程 | 14小时前 |
- Go语言闭包误区与匿名函数深度解析
- 222浏览 收藏
-
- Golang · Go教程 | 14小时前 |
- Debian系统安全回收数据的正确攻略
- 111浏览 收藏
-
- Golang · Go教程 | 16小时前 |
- Debian高效fetch技巧与使用攻略
- 125浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 542次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 508次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 497次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 484次学习
-
- 笔灵AI生成答辩PPT
- 探索笔灵AI生成答辩PPT的强大功能,快速制作高质量答辩PPT。精准内容提取、多样模板匹配、数据可视化、配套自述稿生成,让您的学术和职场展示更加专业与高效。
- 15次使用
-
- 知网AIGC检测服务系统
- 知网AIGC检测服务系统,专注于检测学术文本中的疑似AI生成内容。依托知网海量高质量文献资源,结合先进的“知识增强AIGC检测技术”,系统能够从语言模式和语义逻辑两方面精准识别AI生成内容,适用于学术研究、教育和企业领域,确保文本的真实性和原创性。
- 24次使用
-
- AIGC检测-Aibiye
- AIbiye官网推出的AIGC检测服务,专注于检测ChatGPT、Gemini、Claude等AIGC工具生成的文本,帮助用户确保论文的原创性和学术规范。支持txt和doc(x)格式,检测范围为论文正文,提供高准确性和便捷的用户体验。
- 30次使用
-
- 易笔AI论文
- 易笔AI论文平台提供自动写作、格式校对、查重检测等功能,支持多种学术领域的论文生成。价格优惠,界面友好,操作简便,适用于学术研究者、学生及论文辅导机构。
- 42次使用
-
- 笔启AI论文写作平台
- 笔启AI论文写作平台提供多类型论文生成服务,支持多语言写作,满足学术研究者、学生和职场人士的需求。平台采用AI 4.0版本,确保论文质量和原创性,并提供查重保障和隐私保护。
- 35次使用
-
- Golang中生成随机字符串并复制到粘贴板的方法
- 2023-01-07 276浏览