【go从零单排】Random Numbers、Number Parsing

🌈Don't worry , just coding!
内耗与overthinking只会削弱你的精力,虚度你的光阴,每天迈出一小步,回头时发现已经走了很远。

📗概念

这里是引用

💻代码

Random Numbers

go 复制代码
package main

import (
	"fmt"
	"math/rand/v2" //math/rand/v2:用于生成随机数。注意这里使用的是 rand 包的版本 2。
)

func main() {
	//rand.IntN(100) 生成一个 0 到 99 之间的随机整数。调用两次以生成两个随机整数,并用逗号分隔打印。
	fmt.Print(rand.IntN(100), ",")
	fmt.Print(rand.IntN(100))
	fmt.Println()
	//rand.Float64() 生成一个 0.0 到 1.0 之间的随机浮点数,并打印。
	fmt.Println(rand.Float64())
	//通过 rand.Float64()*5 生成一个 0.0 到 5.0 之间的随机浮点数,再加上 5,使结果范围变为 5.0 到 10.0。
	//调用两次以生成两个随机浮点数,并用逗号分隔打印。
	fmt.Print((rand.Float64()*5)+5, ",")
	fmt.Print((rand.Float64() * 5) + 5)
	fmt.Println()
	//rand.NewPCG(42, 1024) 创建一个新的 PCG(Permuted Congruential Generator)随机数生成器,使用种子值 42 和状态值 1024。
	s2 := rand.NewPCG(42, 1024)
	//rand.New(s2) 使用这个生成器创建一个新的随机数生成器实例 r2。
	r2 := rand.New(s2)
	//通过 r2.IntN(100) 生成两个 0 到 99 之间的随机整数,并用逗号分隔打印。
	fmt.Print(r2.IntN(100), ",")
	fmt.Print(r2.IntN(100))
	fmt.Println()
	//再次创建一个 PCG 随机数生成器,使用相同的种子和状态值,生成器实例为 r3。
	s3 := rand.NewPCG(42, 1024)
	//通过 r3.IntN(100) 生成两个 0 到 99 之间的随机整数,并用逗号分隔打印。
	r3 := rand.New(s3)
	fmt.Print(r3.IntN(100), ",")
	fmt.Print(r3.IntN(100))
	fmt.Println()
}

//输出
//48,89
//0.7365009847357684
//7.945666205049617,7.769640472616085
//94,49
//94,49

Number Parsing

c 复制代码
package main

import (
	"fmt"
	"strconv" //strconv:用于字符串与基本数据类型之间的转换。
)

func main() {
	//strconv.ParseFloat("1.234", 64) 将字符串 "1.234" 转换为 64 位浮点数(float64),结果赋值给 f。
	f, _ := strconv.ParseFloat("1.234", 64)
	fmt.Println(f)
	//strconv.ParseInt("123", 0, 64) 将字符串 "123" 转换为 64 位整数(int64)。
	//第二个参数 0 表示根据字符串的前缀自动推断进制(例如,0x 表示十六进制,0 表示十进制)。
	i, _ := strconv.ParseInt("123", 0, 64)
	fmt.Println(i)
	//strconv.ParseInt("0x1c8", 0, 64) 将字符串 "0x1c8" 转换为整数,0x1c8 是十六进制数,等于十进制的 456。
	d, _ := strconv.ParseInt("0x1c8", 0, 64)
	fmt.Println(d)
	//strconv.ParseUint("789", 0, 64) 将字符串 "789" 转换为 64 位无符号整数(uint64)
	u, _ := strconv.ParseUint("789", 0, 64)
	fmt.Println(u)
	//strconv.Atoi("135") 是 strconv.ParseInt 的简化版本,直接将字符串 "135" 转换为整数(int)。
	k, _ := strconv.Atoi("135")
	fmt.Println(k)
	//strconv.Atoi("wat") 尝试将字符串 "wat" 转换为整数,由于 "wat" 不是有效的数字,转换会失败。
	_, e := strconv.Atoi("wat")
	fmt.Println(e)
}
//输出
//1.234
//123
//456
//789
//135
//strconv.Atoi: parsing "wat": invalid syntax

🔍理解

  • 随机数的可重复性:使用相同的种子会生成相同的随机数序列,这在调试时很有用。
  • 种子选择:在生产环境中,通常会使用当前时间或其他变化的值作为种子,以生成不可预测的随机数序列。
  • 错误处理:在实际应用中,建议对每个转换操作的错误进行处理,避- 免程序因未处理的错误而崩溃。
  • 进制选择:在转换整数时,确保理解进制的选择,尤其是使用 0 作为进制参数时。
  • 浮点数精度:注意浮点数的精度问题,特别是在进行数学运算时。

💡 Tips小知识点

  • 创建自定义的随机数生成器(使用 PCG 算法),并使用相同的种子和状态值生成随机数。使用相同的种子和状态值,r2 和 r3 生成的随机数序列是确定的,因此可以预测这些随机数的值。

💪无人扶我青云志,我自踏雪至山巅。

相关推荐
道不尽世间的沧桑31 分钟前
第17篇:网络请求与Axios集成
开发语言·前端·javascript
久绊A39 分钟前
Python 基本语法的详细解释
开发语言·windows·python
Hylan_J4 小时前
【VSCode】MicroPython环境配置
ide·vscode·python·编辑器
软件黑马王子4 小时前
C#初级教程(4)——流程控制:从基础到实践
开发语言·c#
莫忘初心丶4 小时前
在 Ubuntu 22 上使用 Gunicorn 启动 Flask 应用程序
python·ubuntu·flask·gunicorn
闲猫4 小时前
go orm GORM
开发语言·后端·golang
丁卯4045 小时前
Go语言中使用viper绑定结构体和yaml文件信息时,标签的使用
服务器·后端·golang
李白同学6 小时前
【C语言】结构体内存对齐问题
c语言·开发语言
黑子哥呢?7 小时前
安装Bash completion解决tab不能补全问题
开发语言·bash
失败尽常态5237 小时前
用Python实现Excel数据同步到飞书文档
python·excel·飞书