广告
返回顶部
首页 > 资讯 > 后端开发 > GO >golang中随机数rand的使用
  • 755
分享到

golang中随机数rand的使用

2024-04-02 19:04:59 755人浏览 泡泡鱼
摘要

目录1、math/rand2、crypto/rand1、math/rand 随机数从资源生成。包水平的函数都使用的默认的公共资源。 该资源会在程序每次运行时都产生确定的序列。如果需要

1、math/rand

随机数从资源生成。包水平的函数都使用的默认的公共资源。

该资源会在程序每次运行时都产生确定的序列。如果需要每次运行产生不同的序列,应使用Seed函数进行初始化。默认资源可以安全的用于多Go并发

关于种子seed
程序启动的时候,种子的初始值是一样的,也就是说随机数是一样的,什么意思呢?

package main

import (
   "fmt"
   "math/rand"
)

func main(){
   data := rand.Int63n(100)
   fmt.Println(data)
}
 

每次运行go run main.go
打印的都是 10

如果我们播放种子

package main

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

func main(){
   rand.Seed(time.Now().Unix()) // unix 时间戳,秒
   data := rand.Int63n(100)
   fmt.Println(data)
}

这样每次执行go run main.go

打印的结果就不一样,但是,根据随机数的特性,如果两次执行的时间戳是在同一秒,那么打印的结果是相同的。
以上的随机数相同的情况是发生在程序启动的时候,如果程序启动后,每次生成随机数会怎样呢?

package main

import (
   "fmt"
   "math/rand"
)

func main(){
   for i := 0; i<5; i++ {
      data := rand.Int63n(100)
      fmt.Println(data)
   }
}

运行 go run main.go
打印
10
51
21
51
37

再次运行 go run main.go
打印
10
51
21
51
37

可见每次启动的结果是一样的;但是程序启动后,每次的随机数都不尽相同,是随机的。

如果再加上种子呢?

package main

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

func main(){
   for i := 0; i<5; i++ {
      rand.Seed(time.Now().Unix()) // unix 时间戳,秒
      data := rand.Int63n(100)
      fmt.Println(data)
   }
}

运行 go run main.go
打印
86
86
86
86
86

再次运行 go run main.go
打印
72
72
72
72
72

每次启动程序,因为种子不一样,所以随机数不一样;但是程序启动后,每次也都是播放种子,秒级时间戳,如果时间戳一样,就导致种子一样,生成的随机数就一样,所以五次的随机数是一样的。

通过上面的例子。可以知道,播放种子不是必须的,除非要求每次启动程序的时候随机数不一样。

并且,要设置种子的情况下,应该放在整个程序启动的时候,而且只需要设置一次即可。修改上面的例子:

package main

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

func main(){
   rand.Seed(time.Now().UnixNano()) // 纳秒时间戳
   for i := 0; i<5; i++ {
      data := rand.Int63n(100)
      fmt.Println(data)
   }
}

运行 go run main.go
打印
3
49
46
83
25

再次运行 go run main.go
打印
39
3
14
42
65

这次就是理想的结果了。使用纳秒时间戳基本就没问题了,因为我们的程序几乎不会在1纳秒时间内多次启动的。

下面来讲讲rand包的具体用法

rand 包提供了两块的内容,一块是基于 Rand 结构体及其方法;另一块是基于 Rand 结构体再封装的可直接调用的方法 rand.xxx,查看源码就知道它们是同样的功能。

所以,生成随机数有两种方式

rander := rand.New(rand.NewSource(time.Now().UnixNano()))
n1 := rander.Intn(100)

rand.Seed(time.Now().UnixNano())
n2 := rand.Intn(100)

使用第一种方法,将 rander 作为包的全局变量,这样就只会设置一次种子。

var Rander = rand.New(rand.NewSource(time.Now().UnixNano()))

随机整数

func (r *Rand) Int() int
func (r *Rand) Int31() int32
func (r *Rand) Int63() int64
func (r *Rand) Uint32() uint32
func (r *Rand) Uint64() uint64
func (r *Rand) Intn(n int) int
func (r *Rand) Int31n(n int32) int32
func (r *Rand) Int63n(n int64) int64

Int, Int31, Int63 生成的数都太大,一般使用 Intn, Int31n, Int63n。得到的范围 [0, n),想要得到 [0, n],就要使用 Intn(n + 1),想要得到 [10, 100] 的随机数,就要使用 Intn(91) + 10。

随机浮点数

func (r *Rand) Float32() float32
func (r *Rand) Float64() float64

得到 [0, 1) 之间的浮点数,32单精度,64双精度。

基于正态分布的随机浮点数

func (r *Rand) NORMFloat64() float64

基于指数分布的随机浮点数

func (r *Rand) ExpFloat64() float64

随机序列

func (r *Rand) Perm(n int) []int

返回一个有n个元素的,[0,n)范围内整数的伪随机排列的切片。

Rander.Perm(10) // [1 8 0 4 7 6 3 2 9 5]

总结

package main

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

func main() {
    s := RandString(10)
    fmt.Println(s)
}

var Rander = rand.New(rand.NewSource(time.Now().UnixNano()))

const letterString = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
const numLetterString = "0123456789"

// 随机生成字符串
func RandStr(n int, letter string) string {
    str := []byte(letter)
    res := ""
    for i := 0; i < n; i++ {
        res += fmt.Sprintf("%c", str[Rander.Intn(strings.Count(letter, "") - 1)])
    }
    return res
}

func RandNumStr(n int) string {
    return RandStr(n, numLetterString)
}

func RandString(n int) string {
    return RandStr(n, letterString)
}

func RandOrder(n int) string {
    return time.Now().Format("20060102150405") + RandNumStr(n)
}

// 包含min, max
func RandNum(min , max int) int {
    return Rander.Intn(max - min + 1) + min
}

2、crypto/rand

实现了用于加解密的更安全的随机数生成器。

变量 var Reader io.Reader
是一个全局、共享的密码用强随机生成器。在Unix类型系统中,会从/dev/urandom读取;而windows中会调用RtlGenRandom api

提供的方法

1、返回一个基于[0, max)的随机数

// Int returns a uniform random value in [0, max). It panics if max <= 0.
func Int(rand io.Reader, max *big.Int) (n *big.Int, err error)

示例

r, err := rand.Int(rand.Reader, big.NewInt(100))
fmt.Println(r.Int64(), err)

2、根据指定的位数bits,返回一个数,大概率是素数,(不知道这个函数是干嘛用的)

// Prime returns a number, p, of the given size, such that p is prime
// with high probability.
// Prime will return error for any error returned by rand.Read or if bits < 2.
func Prime(rand io.Reader, bits int) (p *big.Int, err error)

示例

p, err := rand.Prime(rand.Reader, 8)
fmt.Println(p.Int64(), err)

8个二进制位的最大值为255,此处会随机返回小于255的素数。

3、生成随机的二进制序列

// Read is a helper function that calls Reader.Read using io.ReadFull.
// On return, n == len(b) if and only if err == nil.
func Read(b []byte) (n int, err error) {
    return io.ReadFull(Reader, b)
}

比如,随机生成16个字节的数据

var b [16]byte
n, err := rand.Read(b[:])
fmt.Println(n, err)
fmt.Println(b)

返回值
16 <nil>
[94 184 113 36 224 18 239 52 69 242 14 84 174 113 125 15]

我们可以将其转换成16进制数,也就是32位

buf := make([]byte, 32)
hex.Encode(buf, b[:])
fmt.Println(string(buf))

得到
5eb87124e012ef3445f20e54ae717d0f

通过这个方法可以生成随机的字符串。

到此这篇关于golang中随机数rand的使用的文章就介绍到这了,更多相关golang随机数rand内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

您可能感兴趣的文档:

--结束END--

本文标题: golang中随机数rand的使用

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

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

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

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

下载Word文档
猜你喜欢
  • golang中随机数rand的使用
    目录1、math/rand2、crypto/rand1、math/rand 随机数从资源生成。包水平的函数都使用的默认的公共资源。 该资源会在程序每次运行时都产生确定的序列。如果需要...
    99+
    2022-11-11
  • PHP中随机函数rand()的使用方式
    这篇文章主要讲解了“PHP中随机函数rand()的使用方式”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“PHP中随机函数rand()的使用方式”吧!首先二话不说,创建一个PHP示例文件dem...
    99+
    2023-06-20
  • php中怎么使用rand产生随机数
    本篇内容介绍了“php中怎么使用rand产生随机数”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1、概念rand()函数可以生成随机的整数。...
    99+
    2023-06-30
  • 详解Go语言中rand(随机数)包的使用
    目录包"math/rand"随机数种子随机函数rand.Int()rand.Intn(n)实例其他随机函数按类型随机类指定随机范围类伪随机排列的切片生成标准正态分...
    99+
    2022-11-11
  • 怎么在php中使用rand生成随机数
    怎么在php中使用rand生成随机数?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。php有什么特点1、执行速度快。2、具有很好的开放性和可扩展性。3、PHP支持多种主流与非主流...
    99+
    2023-06-14
  • C语言使用rand函数生成随机数
    目录rand()函数函数原型:初步使用生成0到99的随机数再次运行 发现问题查看rand()函数的官方文档srand()函数srand的官方介绍初步使用srand()再次运行发现问题...
    99+
    2022-11-12
  • C语言中随机数rand()函数详解
      在生活中很多场景下都需要产生随机数,比如抽奖,打牌,游戏等场景下就需要使用随机数。在C语言标准库函数里面有专门用来产生随机数的函数rand,它的函数原型如下:...
    99+
    2022-11-13
  • C语言的随机数rand()函数怎么用
    这篇文章主要为大家展示了“C语言的随机数rand()函数怎么用”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“C语言的随机数rand()函数怎么用”这篇文章吧。在生活中很多场景下都需要产生随机数,...
    99+
    2023-06-29
  • C语言的随机数rand()函数详解
    在生活中很多场景下都需要产生随机数,比如抽奖,打牌,游戏等场景下就需要使用随机数。在C语言标准库函数里面有专门用来产生随机数的函数rand,它的函数原型如下: int __cde...
    99+
    2022-11-13
  • PHP中利用rand()函数产生一个随机数的方法
    这篇文章主要介绍了PHP中利用rand()函数产生一个随机数的方法,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。php的框架有哪些php的框架:1、Laravel,Larav...
    99+
    2023-06-14
  • C语言中如何用rand()和srand()函数产生伪随机数
    这篇文章主要介绍“C语言中如何用rand()和srand()函数产生伪随机数”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“C语言中如何用rand()和srand()函数产生伪随机数”文章能帮助大家解...
    99+
    2023-06-16
  • C语言中怎么利用rand()和srand()函数产生伪随机数
    今天就跟大家聊聊有关C语言中怎么利用rand()和srand()函数产生伪随机数,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。rand()会返回一随机数值,范围在0至RAND_MAX...
    99+
    2023-06-17
  • golang随机数的两种方式
    golang支持两种随机数生成方式: math/rand          // 伪随机crypto/rand   &nb...
    99+
    2022-11-13
  • golang数组随机排序的实现
    目录前言具体实现步骤如下1.引入库2.组装数据并排序(方案一)3.组装数据并排序(方案二)总结前言 目前接到一个推荐数据的需求,需要将数据库中获取到的数据进行随机排序后返回给用户。...
    99+
    2022-11-12
  • Excel中RAND函数怎么使用
    在Excel中,可以使用RAND函数生成一个随机数。RAND函数的语法如下:RAND()使用方法:1.选择一个单元格,输入`=RAN...
    99+
    2023-09-07
    Excel RAND
  • php中如何使用rand()函数
    这篇文章主要介绍了php中如何使用rand()函数,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。@session_start(); &nbs...
    99+
    2022-10-19
  • matlab中rand函数怎么使用
    在MATLAB中,可以使用rand函数生成一个具有均匀分布的随机数。其语法如下:1. 生成一个随机数:x = rand2. 生成一个...
    99+
    2023-08-14
    matlab rand
  • C#中的随机数函数Random()怎么使用
    这篇文章主要介绍了C#中的随机数函数Random()怎么使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C#中的随机数函数Random()怎么使用文章都会有所收获,下面我们一起来看看吧。一、常用操作NextD...
    99+
    2023-06-30
  • PHP中如何使用随机数类
    PHP中如何使用随机数类,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。PHP随机数类代码示例:< php  class getRands...
    99+
    2023-06-17
  • 如何进行golang 数组随机排序的实现
    如何进行golang 数组随机排序的实现,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。前言目前接到一个推荐数据的需求,需要将数据库中获取到的数据进行随机排序后返回...
    99+
    2023-06-22
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作