如何从范围中选择一个随机数?

问题描述:

我读了函数Intn https://golang.org/pkg/math/rand/#Intn的文档,但我不明白他们的意思 我知道随机数与伪随机数有什么不同。但是,我如何模拟1到1000范围内的随机数?如何从范围中选择一个随机数?

package main 
import (
    "fmt" 
    "math/rand" 
) 

func main() { 
    fmt.Println(randInt(1, 1000)) 
} 

func randInt(min int, max int) int { 
    return min + rand.Intn(max-min) 
} 

的答案永远是879

func main() { 
    fmt.Print(rand.Intn(100)) 
} 

答案总是81

+1

你是否在围棋操场上这样做? – Adrian

你需要 “种子” 的随机数发生器。这就像告诉伪随机数生成器如何生成数字的代码一样。现在,你不能只给这个数字,或者你每次都要生成相同的数字。通常,一个好的做法是用当前时间种子。

package main 
import (
    "fmt" 
    "math/rand" 
    "time" #ADDED 
) 

func main() { 
    // Seed should be set once, better spot is func init() 
    rand.Seed(time.Now().UTC().UnixNano()) #ADDED 
    fmt.Println(randInt(1, 1000)) 
} 

func randInt(min int, max int) int { 
    return min + rand.Intn(max-min) 
} 

现在每次你打电话给你randInt()功能时,它会使用来自当种子函数被调用,生成随机数的时间。

+0

非常感谢,它的作品! rand.Seed函数如何取决于函数randInt?或者它在某种程度上影响了应用程序和Intn? – gomazafaka

+0

它正在修改rand对象。把它想象成一个存储在rand中的值。默认情况下,它被设置为1.我们只是将其更改为当前时间。 –

两点。首先,如math/rand的文档顶部所示:

如果每次运行都需要不同的行为,请使用Seed函数初始化默认Source。

如果没有不同的东西每次运行(如时钟时间)种子它,你会每次运行时得到相同的结果,因为默认的种子始终是1

第二,如果你'在Playground上运行它,每次你都会得到相同的结果,因为它会缓存执行结果。如果代码相同,结果将是相同的。

+0

这是否意味着Intn需要一些内部程序结构的数据,这些结构必须在种子的帮助下设置?从文档来看,我感到难以理解。 – gomazafaka

+0

所有PRNG的操作方式基本相同,对数字进行排列以获得近乎随机的结果。他们通常将先前的随机数作为下一个随机数的输入;这意味着要生成* first *随机数,他们需要一个起点,这就是“种子”。从相同的种子开始产生相同的数字序列。 – Adrian