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

不用这么搞,标准库有专门的函数

# 0

winebag

分享下,那个标准库可以?

# 1

stevewang

每次获取随机数,都要执行rand.Newrand.NewSource,效率比较低。
另外,这个程序只是保证随机数不与上一个重复,而不是保证全部都不重复。

# 2

snake117

Perm,有库函数和Rand对象成员函数两个版本,提供一个整数n,返回[0,n)范围内所有整数的随机排列。正式你需要的函数。

因为有限范围内“不重复的随机数”也就只能产生有限个数字。

# 3

FlashKnight

鉴于你需要不重复,你只需要把不重复的数字append到slice,然后把slice打乱顺序即可

# 4

jiexiu

@snake117是正解。rank库的Perm方法可以返回[0,n)直接的随机数。但只能第一次调用的结果是随机的。多次调用的结果是不变的。请注意。具体原因看源码就明白了。

# 5

zjx2046

楼上应该是把rand库写成rank库了

# 6

ly8571419

rad := rand.New(rand.NewSource(time.Now().Unix()))
for i := 0; i < rad.Intn(9)+1; i++ {
fmt.Println(rad.Intn(50))
}
妥妥的 都是不一样的随机数

# 7