From a30b918377d1e839fcc92e5a33dd8ddf6b396e23 Mon Sep 17 00:00:00 2001 From: liuxiaobo <1224730913@qq.com> Date: Sun, 8 Jun 2025 17:59:35 +0800 Subject: [PATCH] =?UTF-8?q?=E7=AE=80=E5=8C=96api=E6=95=B0=E9=87=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- xrand/rand.go | 85 ++++++++++++++++++++++++---------------------- xrand/rand_test.go | 14 +++----- 2 files changed, 49 insertions(+), 50 deletions(-) diff --git a/xrand/rand.go b/xrand/rand.go index 9f1682e..656b512 100644 --- a/xrand/rand.go +++ b/xrand/rand.go @@ -11,45 +11,55 @@ func init() { rd = rand.New(rand.NewSource(time.Now().UnixNano())) } -func Int() int { - return rd.Int() +// 随机值 +func Rand[T int | int32 | int64 | uint32 | uint64 | float32 | float64]() T { + switch any(T(0)).(type) { + 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) -func IntN(n int) int { - return rd.Intn(n) +// 从[0,n)范围里随机值 +func RandN[T int | int32 | int64 | uint32 | uint64](n T) T { + if int64(n) < 1 { + return 0 + } + switch any(n).(type) { + 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("不支持的类型") + } } -func Int31() int32 { - return rd.Int31() -} - -func Int31n(n int32) int32 { - return rd.Int31n(n) -} - -func Int63() int64 { - return rd.Int63() -} - -func Int63n(n int64) int64 { - return rd.Int63n(n) -} - -func Uint32() uint32 { - return rd.Uint32() -} - -func Uint64() uint64 { - return rd.Uint64() -} - -func Float32() float32 { - return rd.Float32() -} - -func Float64() float64 { - return rd.Float64() +// 从[0,n)范围里随机值 +func RandRange[T int | int32 | int64 | uint32 | uint64](min, max T) T { + if int64(max) < 1 || int64(min) < 1 || max < min { + return 0 + } + return RandN[T](max-min) + min } func Perm(n int) []int { @@ -66,11 +76,6 @@ func Shuffle[T any](slice []T) { }) } -// RandomInt64 随机生成一个[min, max]之间的整数 -func RandomInt64(min, max int64) int64 { - return Int63n(max-min) + min -} - const letterBytes = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" func RandomString(n int) string { diff --git a/xrand/rand_test.go b/xrand/rand_test.go index 71a9530..93eef9a 100644 --- a/xrand/rand_test.go +++ b/xrand/rand_test.go @@ -10,17 +10,11 @@ func TestShuffle(t *testing.T) { func TestClean(t *testing.T) { _ = t - _ = Int - _ = Int31 - _ = Int31n - _ = Int63 - _ = Int63n - _ = Uint32 - _ = Uint64 - _ = Float32 - _ = Float64 + _ = Rand[int] + _ = RandN[int] + _ = RandRange[int] + _ = Perm _ = Read - _ = RandomInt64 _ = RandomString }