原文:
译文
包
所有的Go程序都是由包组成。
程序在main包中开启运行。
该程序通过导入路径fmt和math/rand来使用包。
根据约定,包名与导入路径的最后一部分同名。例如math/rand包由package rand语句开头的文件组成。
注意:由于程序所处的执行环境是确定的,所以每次执行程序
rand.Intn,返回同样的数字。
(为了能看到不同的数字,可以提供一个数字生成器种子,请看[rand.seed](https://golang.org/pkg/math/rand/#Seed) 。在该练习中时间是常量,所以你需要别的东西来提供)
示例
package main
import (
"fmt"
"math/rand"
"time"
)
func main() {
rand.Seed(int64(time.Now().UnixNano()))
//rand.Seed(int64(time.Now().Minute()))
fmt.Println("My favorite number is ", rand.Intn(10))
}
译者注
文中有一句话:在该练习中时间是常量,所以你需要别的东西来提供。
时间为什么是常量呢?它不是一直在变化吗?理解这句话要明白时间的两个特性:
- 在某个确定时间点,时间是固定不变的。即在某个特定时间点,不管那台server,它对应的时间戳应该是一样的
- 在单位时间内,时间是固定不变的。比如我们以分钟为单位,那么在这一分钟内不管调用多少次,返回的时间都是固定不变的。
基于上面的理解,如果我们以秒或分钟作为种子,那么在这个时间单位内,返回的随机数都是一样的。读者可以将上述代码中注释行取消注释,你会发现在一分钟内rand.Intn(10)返回的值都是一样的。因此也证明了我们常用的随机算法是伪随机的,它取决于随机种子,如果我们能提供一个真实的随机种子,那么随机算法越接近真实随机数。