golang 产生不重复的随机数
package utils
import (
"math/rand"
"time"
)
var channel chan int64 = make(chan int64, 32)
func init() {
go func() {
var old int64
for {
o := rand.New(rand.NewSource(time.Now().UnixNano())).Int63()
if old != o {
old = o
select {
case channel <- o:
}
}
}
}()
}
func RandInt64() (r int64) {
select {
case rand := <-channel:
r = rand
}
return
}
共 8 个回复
snake117
不用这么搞,标准库有专门的函数
winebag
分享下,那个标准库可以?
stevewang
每次获取随机数,都要执行
rand.New
和rand.NewSource
,效率比较低。另外,这个程序只是保证随机数不与上一个重复,而不是保证全部都不重复。
snake117
Perm,有库函数和Rand对象成员函数两个版本,提供一个整数n,返回[0,n)范围内所有整数的随机排列。正式你需要的函数。
因为有限范围内“不重复的随机数”也就只能产生有限个数字。
FlashKnight
鉴于你需要不重复,你只需要把不重复的数字append到slice,然后把slice打乱顺序即可
jiexiu
@snake117是正解。rank库的Perm方法可以返回[0,n)直接的随机数。但只能第一次调用的结果是随机的。多次调用的结果是不变的。请注意。具体原因看源码就明白了。
zjx2046
楼上应该是把rand库写成rank库了
ly8571419
rad := rand.New(rand.NewSource(time.Now().Unix()))
for i := 0; i < rad.Intn(9)+1; i++ {
fmt.Println(rad.Intn(50))
}
妥妥的 都是不一样的随机数