Golang中随机数的生成

本文深入探讨了Golang中随机数生成的方法,强调了初始化随机数种子的重要性,并详细解析了切片的创建、索引及修改原理,通过实例展示了切片长度与容量的概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1,随机数问题
在我们引入了Golang的包 "math/rand"后就可以使用函数 rand.Intn(n) 来生成随机数了
但是如果不初始化随机数的资源库,那么不管执行多少次都返回统一的值
所以我们需要初始化下

rand.Seed(time.Now().UnixNano())
//然后生成随机数,返回0到n之间的随机整数
rand.Intn(n)

2 数组切片
切片是由数组建立的一种方便,灵活切功能强大的包装,注意的是切片本省不拥有任何数据,它们只是现有数组的引用。
1 创建带有T类型的切片表示方法[]T,我们可以通过make([]T, len, cap)来创建一个切片,其中len表示切片长度(即切片中的元素数),cap表示切片容量(即从创建切片索引开始的底层数组中元素数)
2 使用语法:a[start:end] 创建一个从a数据索引start开始到end-1结束的切片
3 切片的修改,由于切片本身不具有任何数据,对切片所做的任何修改都会反映在底层数组中。
4 如果遇到了 a[:]这种缺少开始和结束值的,那么开始和结束值默认为0和len(a)

详解:以一个例子解释切片长度和容量

func main() {
    fruitarray := [...]string{"apple", "orange", "grape", "mango", "water melon", "pine apple", "chikoo"}
    fruitslice := fruitarray[1:3]
    fmt.Printf("length of slice %d capacity %d", len(fruitslice), cap(fruitslice)) // 
}
length of is 2 and capacity is 6 ,fruitslice是fruitarray的切片引用,表示从12的元素,但是,fruitslice的底层数组fruitarray元素时6个没有变化
### 在 Golang生成随机数Golang生成随机数通常依赖于标准库中的 `math/rand` 和 `crypto/rand` 包。下面详细介绍两种方式及其具体应用。 #### 使用 `math/rand` 包生成随机数 `math/rand` 提供了一组用于生成随机数的函数,这些函数基于线性同余发生器(LCG)。如果不设置种子,程序每次运行都会得到相同的随机数序列。因此,在大多数情况下都需要调用 `rand.Seed()` 来初始化随机数生成器。 ```go package main import ( "fmt" "math/rand" "time" ) func main() { rand.Seed(time.Now().UnixNano()) // 设置随机数种子[^1] randomInt := rand.Intn(10) // 生成范围为 [0, 10) 的整数 fmt.Println("Random Integer:", randomInt) randomFloat := rand.Float64() // 生成范围为 [0.0, 1.0) 的浮点数 fmt.Println("Random Float:", randomFloat) permutedNumbers := rand.Perm(5) // 返回一个打乱顺序后的前 N 个自然数列表 fmt.Println("Permuted Numbers:", permutedNumbers) } ``` 以上代码展示了如何生成不同类型的随机数值以及如何创建一组排列好的随机数列[^3]。 #### 利用 `crypto/rand` 实现更强安全性需求下的随机数生成 当应用程序涉及到密码学用途时,应该选择更为安全可靠的随机源。此时推荐使用来自 `crypto/rand` 包内的功能,因为它们提供了操作系统层面的安全熵池支持,从而能够提供更高品质的随机比特流。 下面是关于怎样借助该包构建任意长度字节数组的例子: ```go package main import ( "crypto/rand" "encoding/hex" "fmt" "log" ) func generateSecureToken(length int) (string, error) { tokenBytes := make([]byte, length) _, err := rand.Read(tokenBytes) // 将随机字节读入到 tokenBytes 数组中[^2] if err != nil { return "", err } return hex.EncodeToString(tokenBytes), nil } func main() { tokenStr, err := generateSecureToken(16) // 创建具有指定大小的安全令牌字符串表示形式 if err != nil { log.Fatal(err) } fmt.Println("Generated Secure Token:", tokenStr) } ``` 这里我们定义了一个辅助函数 `generateSecureToken` ,它接受期望获得的字节数作为参数,并返回经过十六进制编码处理过的最终结果。如果遇到任何异常状况,则停止执行并向终端打印错误消息。 --- 总结而言,针对普通的非敏感型应用场景可以选择效率较高的 `math/rand` 解决方案;而一旦牵涉到加密运算等领域的时候就务必切换至具备充分安全保障特性的替代品 —— 即 `crypto/rand` 。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值