Random 在Go中生成一个范围内的随机数
中的所有整数函数都生成非负数Random 在Go中生成一个范围内的随机数,random,go,Random,Go,中的所有整数函数都生成非负数 rand.Int() int // [0, MaxInt] rand.Int31() int32 // [0, MaxInt32] rand.Int31n(n int32) int32 // [0, n) rand.Int63() int64 // [0, MaxInt64] rand.Int63n(n int64) int64 // [0, n) rand.Intn(n int) int
rand.Int() int // [0, MaxInt]
rand.Int31() int32 // [0, MaxInt32]
rand.Int31n(n int32) int32 // [0, n)
rand.Int63() int64 // [0, MaxInt64]
rand.Int63n(n int64) int64 // [0, n)
rand.Intn(n int) int // [0, n)
我想生成范围[-m,n)中的随机数。换句话说,我想生成正数和负数的混合。我在上找到了这个示例,它相当于rand.range(min,max int)
(如果该函数存在):
rand.Int() int // [0, MaxInt]
rand.Int31() int32 // [0, MaxInt32]
rand.Int31n(n int32) int32 // [0, n)
rand.Int63() int64 // [0, MaxInt64]
rand.Int63n(n int64) int64 // [0, n)
rand.Intn(n int) int // [0, n)
每次需要添加此额外行以获得随机值:
rand.Seed(time.Now().UnixNano())
为了防止反复出现
min
和max
,我建议在考虑时切换范围和随机性。这就是我发现的工作原理:
package main
import (
"fmt"
"math/rand"
)
// range specification, note that min <= max
type IntRange struct {
min, max int
}
// get next random value within the interval including min and max
func (ir *IntRange) NextRandom(r* rand.Rand) int {
return r.Intn(ir.max - ir.min +1) + ir.min
}
func main() {
r := rand.New(rand.NewSource(55))
ir := IntRange{-1,1}
for i := 0; i<10; i++ {
fmt.Println(ir.NextRandom(r))
}
}
主程序包
进口(
“fmt”
“数学/兰德”
)
//范围规范,请注意,min是我为生成随机切片而编写的一个小实用程序(非常类似于python范围)
代码-
这将在给定范围[a,b]内生成随机数
rand.Seed(time.Now().UnixNano())
n := a + rand.Intn(b-a+1)
对我有效的解决方案是:
j=兰特国际贸易(600)-100
当m为100,而n为500时,它将生成从-100到499的数字。您对范围的说明对您来说可能是显而易见的,并且在数学上可能是明确的,但大多数人都被对称性深深吸引,因此许多人会想到间隔[min,max]
。好吧,也许是口味的问题……换句话说:正数和负数的混合将是不平衡的。好主意,@Wolf——我注意到烹饪书的例子也有同样的问题。(这本应该有更多的选票,但选民似乎很久以前就离开了。)…嗯,你还在这里;)我认为我的变体应该被理解为一个旁注,因为OP明确地引用了范围[-m,n)
这是对程序员最常见的范围的理解,大多数不是用户……顺便说一句:隔离间隔可能很有趣,有时很有帮助,但对于良好的命名肯定很有挑战性:今天,我对产生NextRandom
值的IntRange
有点困惑。始终返回静态价值,而不是randomized@LekaBaper您需要使用rand.seed(time.Now().UnixNano())
rand.seed(time.Now().UnixNano())
对随机数生成器进行种子设定。每次仍然返回固定值。确保在任何其他rand
调用之前先调用它。如果这不起作用,请确保time.Now().UnixNano()
每次程序运行时都返回不同的值。fmt.Println(time.Now().UnixNano())
该问题要求在[min,max]范围内的随机数。范围[1,2]中唯一的数字是1。这是实际给出最大值的最简单答案。
rand.Seed(time.Now().UnixNano())
n := a + rand.Intn(b-a+1)