广告
返回顶部
首页 > 资讯 > 精选 >go语言如何生成随机数和随机字符串
  • 516
分享到

go语言如何生成随机数和随机字符串

2023-06-22 00:06:13 516人浏览 泡泡鱼
摘要

小编给大家分享一下Go语言如何生成随机数和随机字符串,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!生成随机数随机数的生成是计算机科学的一个研究领域,同时也是一种艺

小编给大家分享一下Go语言如何生成随机数和随机字符串,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

生成随机数

随机数的生成是计算机科学的一个研究领域,同时也是一种艺术。这是因为计算机是纯粹的逻辑机器,所以使用计算机生成随机数异常困难!

你可以用 math/rand 包来生成随机数。开始生成随机数之前首先需要一个种子,种子用于整个过程的初始化,它相当重要。因为如果你每次都用同样的种子初始化,那么就总是会得到相同的随机数序列。这意味着每个人都可以重新生成同一个序列,那这个序列就根本不能再算是随机的了!

我们将用来生成随机数的程序名为 randomNumbers.go,下面分成四个部分进行介绍。这个程序需要几个参数,分别是生成随机数的下限、生成随机数的上限、生成随机数的数量。如果你还用了第四个命令参数,那么程序会将它作为随机数生成器的种子。在测试的时候,你就可以再次使用这个参数生成相同的数列。

程序的第一部分如下所示:

package mainimport (    "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 < TOTAL; i++ {        myrand := random(MIN, MAX)        fmt.Print(myrand)        fmt.Print(" ")    }    fmt.Println()}

除了使用 Unix 时间戳作为随机数生成器的种子,你还可以使用 /dev/random 这个系统设备。你可以在第 8 章“Go Unix系统编程”中了解 /dev/random 的相关内容。

执行 randomNumbers.go 将会生成如下输出:

$ go run randomNumbers.go75 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 2Usage: ./randomNumbers MIN MAX TOTAL SEED1 1 $ go run randomNumbers.go 1 3 2Usage: ./randomNumbers MIN MAX TOTAL SEED2 2$ go run randomNumbers.go 1 5 10 103 1 4 4 1 1 4 4 4 3$ go run randomNumbers.go 1 5 10 103 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 mainimport (    "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  <    61  =    62  >    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.goUsing default values!ugs$5mv1$ go run generatePassword.goUsing default values!PA/8hA@?$ go run generatePassword.go 20HBR+=3\UA'B@ExT4QG|o$ go run generatePassword.go 20XLcr|R{*pX/::'t2u^T'

以上是“go语言如何生成随机数和随机字符串”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网精选频道!

--结束END--

本文标题: go语言如何生成随机数和随机字符串

本文链接: https://www.lsjlt.com/news/301555.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • go语言如何生成随机数和随机字符串
    小编给大家分享一下go语言如何生成随机数和随机字符串,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!生成随机数随机数的生成是计算机科学的一个研究领域,同时也是一种艺...
    99+
    2023-06-22
  • go语言生成随机数和随机字符串的实现方法
    目录生成随机数生成随机字符串生成随机数 随机数的生成是计算机科学的一个研究领域,同时也是一种艺术。这是因为计算机是纯粹的逻辑机器,所以使用计算机生成随机数异常困难! 你可以用...
    99+
    2022-06-07
    GO 方法 字符串 go语言 随机数 字符
  • Hutool 生成随机数和随机字符串
    目录 1.原生Java代码实现:2.Hutool工具实现: 官方文档: https://www.hutool.cn/docs/#/core/工具类/随机工具-RandomUtil 1.原生Java代码实现: priva...
    99+
    2023-08-16
    java 开发语言
  • python生成随机数、随机字符、随机字符串的方法示例
    本文是基于Windows 10系统环境,实现python生成随机数、随机字符、随机字符串: Windows 10 PyCharm 2018.3.5 for Windows ...
    99+
    2022-11-12
  • python 产生随机数,随机字符串
    import random#随机整数:print random.randint(1,50)#随机选取0到100间的偶数:print random.randrange(0, 101, 2)#随机浮点数:print random.random(...
    99+
    2023-01-31
    随机数 字符串 python
  • php生成随机字符串
    <phpfunction random_string( $length = 20 ) {    //字符集,可任意添加你需要的字符    $chars = 'ABCD'; &nb...
    99+
    2023-01-30
    字符串 php
  • python生成随机字符串
    import random,string def genRandomString(slen=10): return ''.join(random.sample(string.ascii_letters + string.d...
    99+
    2023-01-31
    字符串 python
  • Python中怎么生成随机数与随机字符串
    这篇文章将为大家详细讲解有关Python中怎么生成随机数与随机字符串,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。random.random()用于生成用于生成一个指定范围内的随机符点数,两...
    99+
    2023-06-17
  • php如何生成随机字符串
    在php中使用str_shuffle()和substr()函数随机生成字符串,具体方法如下:首先,新建一个php项目文件;php项目文件新建好后,在文件中定义生成字符串的范围;$str = 'aodnymcueifghw';字符串...
    99+
    2022-10-03
  • 如何在Linux中使用Shell 生成随机数和随机字符串
    本篇文章为大家展示了如何在Linux中使用Shell 生成随机数和随机字符串,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。什么是Linux系统Linux是一种免费使用和自由传播的类UNIX操作系统,...
    99+
    2023-06-09
  • Linux Shell 生成随机数和随机字符串的方法示例
    日常生活中,会经常用到随机数,使用场景非常广泛,例如买彩票、丢骰子、抽签、年会抽奖等。 Shell 下如何生成随机数呢,米扑博客特意写了本文,总结 linux Shell 产生随机数的多种方法。 计算机产生的的只是“伪随...
    99+
    2022-06-04
    Linux Shell 生成随机数 Linux Shell 随机字符串
  • 详解Linux如何生成随机数字和字符串
    生成随机数字 1.使用系统的$RANDOM变量 > echo $RANDOM 14587 2.使用date +%s%N > date +%s%N 1529584024896587259 3....
    99+
    2022-06-04
    Linux 生成随机数字 Linux 生成随机字符串
  • 在 Python 中生成随机字符串
    介绍生成随机字符串的几种方法: 1. 使用random.choice()实现 import stringimport randomnumber_of_strings = 5length_of_stri...
    99+
    2023-09-06
    python
  • python随机生成字符串学习
    所用到的函数学习string模块的三个函数>>> import string >>> string.letters 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefg...
    99+
    2023-01-31
    字符串 python
  • java如何随机生成时间字符串
    小编给大家分享一下java如何随机生成时间字符串,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!具体内容如下package com.wechat.util...
    99+
    2023-05-30
    java 字符串
  • java生成随机字符串的方法
      今天我们来学习下随机数的生成,随机数就是不确定的数,它可以是任意一个整数或者字符串。下面就让我们一起来学习下随机字符串的生成吧。 首先,我们需要先定义一个名为 str的数组,并将它作为输入文件。 1、使用 Java中的 str作为输入...
    99+
    2023-10-25
    java python pandas
  • Python生成随机数字和字符详情
    目录random库生成一个指定长度的随机字符串Faker库random库 random是python自带库,使用前导入 import random 即可,无需安装。 举例: imp...
    99+
    2022-11-11
  • JavaScript如何生成一个随机的数字字母字符串
    这篇文章主要介绍了JavaScript如何生成一个随机的数字字母字符串,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。生成一个随机的数字字母字...
    99+
    2022-10-19
  • c语言中如何生成随机数
    小编给大家分享一下c语言中如何生成随机数,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧! 生成随机数的N种方式首先需要说明的是,计算机中生成的随机数严格来...
    99+
    2023-06-16
  • Go如何生成随机数组?
    package main import ( "fmt" "math/rand" "time" ) func main() { // 4. 随机生成五个数,并将其反转打印。复杂应...
    99+
    2022-06-07
    GO 随机数 数组
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作