Go之旅(一)包

435 阅读2分钟

原文:

tour.golang.org/basics/1

译文

所有的Go程序都是由包组成。

程序在main包中开启运行。

该程序通过导入路径fmtmath/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))
}

译者注

文中有一句话:在该练习中时间是常量,所以你需要别的东西来提供。

时间为什么是常量呢?它不是一直在变化吗?理解这句话要明白时间的两个特性:

  1. 在某个确定时间点,时间是固定不变的。即在某个特定时间点,不管那台server,它对应的时间戳应该是一样的
  2. 在单位时间内,时间是固定不变的。比如我们以分钟为单位,那么在这一分钟内不管调用多少次,返回的时间都是固定不变的。

基于上面的理解,如果我们以秒或分钟作为种子,那么在这个时间单位内,返回的随机数都是一样的。读者可以将上述代码中注释行取消注释,你会发现在一分钟内rand.Intn(10)返回的值都是一样的。因此也证明了我们常用的随机算法是伪随机的,它取决于随机种子,如果我们能提供一个真实的随机种子,那么随机算法越接近真实随机数。