Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Random 在Go中生成一个范围内的随机数_Random_Go - Fatal编程技术网

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)