// 该函数设置随机种子// 若不调用此函数设置随机种子,则默认的种子值为1,由于随机算法是固定的,// 如果每次都以1作为随机种子开始产生随机数,则结果都是一样的,因此一般// 都需要调用此函数来设置随机种子,通常的做法是以当前时间作为随机种子// 以保证每次随机种子都不同,从而产生的随机数也不通// 该函数协程安全func seed(seed int64)// 以下函数用来生成相应数据类型的随机数,带n的版本则生成[0,n)的随机数。// 注意生成的随机数都是非负数func float32() float32func float64() float64func int() intfunc int31() int32 // 注意该函数只返回int32表示范围内的非负数,位数为31,因此该函数叫做int31func int31n(n int32) int32func int63() int64func int63n(n int64) int64func intn(n int) intfunc uint32() uint32func uint64() uint64// 另外,rand包还提供了一个类,接口和上面的大致相同:type rand struct { // ...}// 创建一个以seed为种子的源,注意该源不是协程安全的func newsource(seed int64) source// 以src为源创建随机对象func new(src source) *rand// 设置或重置种子,注意该函数不是协程安全的func (r *rand) seed(seed int64)// 下面的函数和全局版本的函数功能一样func (r *rand) float32() float32func (r *rand) float64() float64func (r *rand) int() intfunc (r *rand) int31() int32func (r *rand) int31n(n int32) int32func (r *rand) int63() int64func (r *rand) int63n(n int64) int64func (r *rand) intn(n int) intfunc (r *rand) uint32() uint32func (r *rand) uint64() uint64
生成随机数时,以当前时间作为随机种子是个很好的选择,可以用time包生成当前时间:
// 返回当前时间func now() time// 为了将time类型转换为int64类型以作为随机种子// 可以使用如下两个函数:// 返回从1970年1月1日到t的秒数func (t time) unix() int64// 返回从1970年1月1日到t的纳秒数func (t time) unixnano() int64
例如
package mainimport ( "fmt" "math/rand" "time")func main() { // // 全局函数 // rand.seed(time.now().unix()) fmt.println(rand.int()) // int随机值,返回值为int fmt.println(rand.intn(100)) // [0,100)的随机值,返回值为int fmt.println(rand.int31()) // 31位int随机值,返回值为int32 fmt.println(rand.int31n(100)) // [0,100)的随机值,返回值为int32 fmt.println(rand.float32()) // 32位float随机值,返回值为float32 fmt.println(rand.float64()) // 64位float随机值,返回值为float64 // 如果要产生负数到正数的随机值,只需要将生成的随机数减去相应数值即可 fmt.println(rand.intn(100) - 50) // [-50, 50)的随机值 // // rand对象 // r := rand.new(rand.newsource(time.now().unix())) fmt.println(r.int()) // int随机值,返回值为int fmt.println(r.intn(100)) // [0,100)的随机值,返回值为int fmt.println(r.int31()) // 31位int随机值,返回值为int32 fmt.println(r.int31n(100)) // [0,100)的随机值,返回值为int32 fmt.println(r.float32()) // 32位float随机值,返回值为float32 fmt.println(r.float64()) // 64位float随机值,返回值为float64 // 如果要产生负数到正数的随机值,只需要将生成的随机数减去相应数值即可 fmt.println(r.intn(100) - 50) // [-50, 50)的随机值}
以上就是golang怎么生成不重复随机数的详细内容。
