golang中生成随机数

golang中生成随机数可以使用rand提供的相关接口,但是需要注意的是,rand必须要指定一个种子,一般采用当前时间的纳秒。

func New(src Source) *Rand {
	s64, _ := src.(Source64)
	return &Rand{src: src, s64: s64}
}

func NewSource(seed int64) Source {
	var rng rngSource
	rng.Seed(seed)
	return &rng
}

通过上述两个接口,生成一个Rand对象,然后通过他来生成随机数:

random := rand.New(rand.NewSource(time.Now().UnixNano()))
	for i:=0;i<30;i++ {
		fmt.Printf("%d " ,random.Intn(9))
	}

func (r *Rand) Intn(n int)指定生成一个在区间[0,n)的整数

func (r *Rand) Float32() float32返回一个[0.0,1.0)的随机小叔

### 在 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、付费专栏及课程。

余额充值