优化随机数
This commit is contained in:
parent
930e08bbdc
commit
7038f76780
@ -1,60 +1,38 @@
|
|||||||
package xrand
|
package xrand
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
randx "crypto/rand"
|
||||||
|
"math"
|
||||||
|
"math/big"
|
||||||
"math/rand"
|
"math/rand"
|
||||||
"time"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
var rd *rand.Rand
|
var rd *rand.Rand
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
rd = rand.New(rand.NewSource(time.Now().UnixNano()))
|
rd = rand.New(rand.NewSource(randInt64()))
|
||||||
|
}
|
||||||
|
|
||||||
|
// 用系统熵构建更自然的随机数,比"math/rand"构建的线性同余自然随机数要慢
|
||||||
|
func randInt64() int64 {
|
||||||
|
n, _ := randx.Int(randx.Reader, big.NewInt(math.MaxInt64))
|
||||||
|
return n.Int64()
|
||||||
}
|
}
|
||||||
|
|
||||||
// 随机值
|
// 随机值
|
||||||
func Rand[T int | int32 | int64 | uint32 | uint64 | float32 | float64]() T {
|
func Rand[T int | int32 | int64 | uint32 | uint64]() T {
|
||||||
switch any(T(0)).(type) {
|
return T(randInt64())
|
||||||
case int:
|
|
||||||
return T(rd.Int())
|
|
||||||
case int32:
|
|
||||||
return T(rd.Int31())
|
|
||||||
case int64:
|
|
||||||
return T(rd.Int63())
|
|
||||||
case uint32:
|
|
||||||
return T(rd.Uint32())
|
|
||||||
case uint64:
|
|
||||||
return T(rd.Uint64())
|
|
||||||
case float32:
|
|
||||||
return T(rd.Float32())
|
|
||||||
case float64:
|
|
||||||
return T(rd.Float64())
|
|
||||||
default:
|
|
||||||
panic("不支持的类型")
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// 从[0,n)范围里随机值
|
// 从[0,n)范围里随机值
|
||||||
func RandN[T int | int32 | int64 | uint32 | uint64](n T) T {
|
func RandN[T int | int32 | int64 | uint | uint32 | uint64](n T) T {
|
||||||
if int64(n) < 1 {
|
if int64(n) < 1 {
|
||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
switch any(n).(type) {
|
return T(randInt64() % int64(n)) // [0,n) 的随机整数
|
||||||
case int:
|
|
||||||
return T(rd.Intn(int(n))) // [0,n) 的随机整数
|
|
||||||
case int32:
|
|
||||||
return T(rd.Int31n(int32(n)))
|
|
||||||
case int64:
|
|
||||||
return T(rd.Int63n(int64(n)))
|
|
||||||
case uint32:
|
|
||||||
return T(rd.Uint32() % uint32(n)) // 注意:这里有小偏差
|
|
||||||
case uint64:
|
|
||||||
return T(rand.Uint64() % uint64(n))
|
|
||||||
default:
|
|
||||||
panic("不支持的类型")
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// 从[0,n)范围里随机值
|
// 从[min,max)范围里随机值
|
||||||
func RandRange[T int | int32 | int64 | uint32 | uint64](min, max T) T {
|
func RandRange[T int | int32 | int64 | uint32 | uint64](min, max T) T {
|
||||||
if int64(max) < 1 || int64(min) < 1 || max < min {
|
if int64(max) < 1 || int64(min) < 1 || max < min {
|
||||||
return 0
|
return 0
|
||||||
|
Loading…
x
Reference in New Issue
Block a user