返回顶部
首页 > 资讯 > 后端开发 > 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://lsjlt.com/news/121023.html(转载时请注明来源链接)

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

猜你喜欢
  • golang中随机数rand的使用
    目录1、math/rand2、crypto/rand1、math/rand 随机数从资源生成。包水平的函数都使用的默认的公共资源。 该资源会在程序每次运行时都产生确定的序列。如果需要...
    99+
    2024-04-02
  • 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+
    2024-04-02
  • 怎么在php中使用rand生成随机数
    怎么在php中使用rand生成随机数?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。php有什么特点1、执行速度快。2、具有很好的开放性和可扩展性。3、PHP支持多种主流与非主流...
    99+
    2023-06-14
  • C语言使用rand函数生成随机数
    目录rand()函数函数原型:初步使用生成0到99的随机数再次运行 发现问题查看rand()函数的官方文档srand()函数srand的官方介绍初步使用srand()再次运行发现问题...
    99+
    2024-04-02
  • C语言中随机数rand()函数详解
      在生活中很多场景下都需要产生随机数,比如抽奖,打牌,游戏等场景下就需要使用随机数。在C语言标准库函数里面有专门用来产生随机数的函数rand,它的函数原型如下:...
    99+
    2024-04-02
  • C语言的随机数rand()函数怎么用
    这篇文章主要为大家展示了“C语言的随机数rand()函数怎么用”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“C语言的随机数rand()函数怎么用”这篇文章吧。在生活中很多场景下都需要产生随机数,...
    99+
    2023-06-29
  • PHP中rand函数为何不产生随机数?
    PHP中的rand()函数是用来生成一个指定范围内的随机整数的函数。然而,有时候会出现rand()函数不产生随机数的情况,这可能是由于某些原因所致。 首先,要了解为什么rand()函数...
    99+
    2024-03-12
    php 随机数 rand函数
  • C语言的随机数rand()函数详解
    在生活中很多场景下都需要产生随机数,比如抽奖,打牌,游戏等场景下就需要使用随机数。在C语言标准库函数里面有专门用来产生随机数的函数rand,它的函数原型如下: int __cde...
    99+
    2024-04-02
  • PHP中利用rand()函数产生一个随机数的方法
    这篇文章主要介绍了PHP中利用rand()函数产生一个随机数的方法,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。php的框架有哪些php的框架:1、Laravel,Larav...
    99+
    2023-06-14
  • PHP中rand函数的随机性研究与分析
    PHP中rand函数的随机性研究与分析 随机数在计算机编程中有着广泛的应用,而PHP中的rand函数是用来生成随机整数的常用方法之一。本文将探讨PHP中rand函数的随机性,并通过具体...
    99+
    2024-03-12
    php rand 随机性
  • 深入探讨PHP中rand函数的随机性问题
    标题:深入探讨PHP中rand函数的随机性问题 在编程中,随机数的生成是一项经常会用到的功能之一。在PHP编程中,我们通常会使用rand()函数来生成一个随机数。然而,对于rand()...
    99+
    2024-03-12
    php rand函数 随机性
  • PHP中rand函数的随机性验证与改进方法
    PHP中rand函数的随机性验证与改进方法 在 PHP 开发中,我们经常会使用到 rand 函数来生成随机数。然而,有时候我们会怀疑 rand 函数生成的随机数是否真的是随机的。本文将...
    99+
    2024-03-13
    - php - 随机性 - 改进 标准库
  • C语言中如何用rand()和srand()函数产生伪随机数
    这篇文章主要介绍“C语言中如何用rand()和srand()函数产生伪随机数”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“C语言中如何用rand()和srand()函数产生伪随机数”文章能帮助大家解...
    99+
    2023-06-16
  • 如何解决PHP中rand函数不生成随机数的问题?
    解决PHP中rand函数不生成随机数的问题 在PHP中,rand()函数用于生成指定范围内的随机整数。然而,有时候可能会遇到rand函数不生成随机数的问题,导致程序无法正常运行。这可能...
    99+
    2024-03-12
    php随机数问题 php随机数失效
  • C语言中怎么利用rand()和srand()函数产生伪随机数
    今天就跟大家聊聊有关C语言中怎么利用rand()和srand()函数产生伪随机数,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。rand()会返回一随机数值,范围在0至RAND_MAX...
    99+
    2023-06-17
  • 如何在 Golang 中使用随机数进行模拟?
    使用 math/rand 包进行随机数模拟:导入 math/rand 包。使用 time.now().unixnano() 初始化随机数生成器。使用 rand.intn(n) 生成 0 ...
    99+
    2024-05-13
    模拟 随机数 golang
  • php rand函数生成相同随机数如何解决
    这篇文章主要介绍了php rand函数生成相同随机数如何解决的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇php rand函数生成相同随机数如何解决文章都会有所收获,下面我们一起来看看吧。首先,让我们看一下ra...
    99+
    2023-07-05
  • 通过标准库包math/rand和crypto/rand生成的随机数之间有什么区别?
    ...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作