golang rand生成随机数

简介

  • math/rand package实现了伪随机数字生成器。
  • 随机数字是通过Source生成的,rand.Seed会初始化默认全局的Source,如果不调用rand.Seed就会使用默认的Source。所生成的随机数字是固定顺序生成的,每次运行程序如果seed相同的话,生成随机数是相同的。
  • 默认的Source是线程安全的,自己通过New生成的不是。

参考: https://golang.org/pkg/math/rand/
Package rand implements pseudo-random number generators.

Random numbers are generated by a Source. Top-level functions, such as Float64 and Int, use a default shared Source that produces a deterministic sequence of values each time a program is run. Use the Seed function to initialize the default Source if different behavior is required for each run. The default Source is safe for concurrent use by multiple goroutines, but Sources created by NewSource are not.

例子

源码:https://github.com/zhiweiyin318/yzw.go.demo/tree/master/rand

  • rand1 使用默认的Seed和Source,每次执行main,获取的随机数字都是相同的。

    func rand1() {
    	fmt.Println("rand1 test ######## rand.xx ######## ")
    	fmt.Println("rand int : ", rand.Int(), rand.Int31())
    	// random int in [0,100)
    	fmt.Println("random int in [0,100) : ", rand.Intn(100))
    	// random int in [-50,50)
    	fmt.Println("random int in [-50,50) : ", rand.Intn(100)-50)
    	fmt.Println("rand float : ", rand.Float64())
    }
    
  • rand2 每次配置相同的Seed,则生成的随机值都是相同的。下面循环5次的随机数字都是一样的,因为Seed重装了Source,都是从头开始生成随机数。

    func rand2() {
    	fmt.Println("rand2 test ######## generate the same random values using the same rand.Seed  ######## ")
    	for i := 0; i < 5; i++ {
    		rand.Seed(10)
    		fmt.Println("rand seed 10 int : ", rand.Int(), rand.Int31())
    	}
    }
    
  • rand3 配置不同的Seed,生成的随机值是不同的。但是同一个Seed在执行main后生成的值都是相同的。

    func rand3(){
    	fmt.Println("rand2 test ######## generate the same random values using the different rand.Seed  ######## ")
    	for i := 0; i < 5; i++ {
    		rand.Seed((int64)(i))
    		fmt.Println("rand seed 10 int : ", rand.Int(), rand.Int31())
    	}
    }
    
  • rand4 使用rand.New()生成新的rand,rand.NewSource()生成新的Source。

    func rand4() {
    	fmt.Println("rand4 test ######## rand.NewSource and rand.New ######## ")
    	s := rand.New(rand.NewSource(1))
    	for i := 0; i < 5; i++ {
    		fmt.Println("rand4: ", s.Int(), s.Intn(20), s.Float64())
    	}
    }
    
  • rand5 保证每次运行程序随机值跟上次不一样,可以通过当前实际生成Seed

    func rand5(){
    	fmt.Println("rand4 test ######## use time.Now().Unix() as seed ######## ")
    	rand.Seed(time.Now().Unix())
    	for i := 0; i < 5; i++ {
    		fmt.Println("rand seed 10 int : ", rand.Int(), rand.Int31())
    	}
    }
    
  • rand6 协程安全测试

    待补充...
    
golang  code 

See also

comments powered by Disqus