ASP源码.NET源码PHP源码JSP源码JAVA源码DELPHI源码PB源码VC源码VB源码Android源码
当前位置:首页 >> yabo88wap下载亚博体育 >> web前端 >> 关于golang随机数的一个好玩的事情

关于golang随机数的一个好玩的事情

来源:网络整理?????时间:2019-07-02?????关键词:

本篇文章主要介绍了" 关于golang随机数的一个好玩的事情",主要涉及到方面的内容,对于web前端感兴趣的同学可以参考一下: golang随机数有一个很好玩的地方,如果我们不自行定义随机数种子的话,每次的随机数都是一样的。比如我们for循环,取8个随机数,每次运行结果是一模一样的。代码...

golang随机数有一个很好玩的地方,如果我们不自行定义随机数种子的话,每次的随机数都是一样的。


比如我们for循环,取8个随机数,每次运行结果是一模一样的。代码如下:




package main


import (

? ? "fmt"

? ? "math/rand"

)


var c chan int


func product(){

? ? r := rand.Intn(10)

? ? fmt.Println("随机数: ", r)

? ? c <- r

}


func main(){

? ? c = make(chan int, 8)

? ? for i:= 0; i<8; i++{

? ? ? ? go product()

? ? }

? ? total := 0

? ? for i:= 0; i<8; i++{

? ? ? ? total += <- c

? ? }

? ? fmt.Println("总和: ", total)

}




结果如下:



? ?src go run index.go

随机数: ?9

随机数: ?7

随机数: ?7

随机数: ?1

随机数: ?8

随机数: ?5

随机数: ?1

随机数: ?0

总和: ?38

? ?src go run index.go

随机数: ?7

随机数: ?8

随机数: ?5

随机数: ?1

随机数: ?0

随机数: ?1

随机数: ?9

随机数: ?7

总和: ?38

? ?src go run index.go

随机数: ?1

随机数: ?8

随机数: ?1

随机数: ?5

随机数: ?7

随机数: ?0

随机数: ?7

随机数: ?9

总和: ?38

? ?src go run index.go

随机数: ?7

随机数: ?1

随机数: ?9

随机数: ?1

随机数: ?8

随机数: ?5

随机数: ?0

随机数: ?7

总和: ?38

? ?src go run index.go

随机数: ?7

随机数: ?9

随机数: ?1

随机数: ?8

随机数: ?0

随机数: ?5

随机数: ?1

随机数: ?7

总和: ?38

? ?src go run index.go

随机数: ?7

随机数: ?1

随机数: ?1

随机数: ?9

随机数: ?8

随机数: ?5

随机数: ?0

随机数: ?7

总和: ?38




可以看出,每次随机数都是0、1、1、5、7、7、8、9,总和一直都是38。因为使用了go关键字,所以顺序不同,但是如果去掉go关键字,改为单去程的话,那真就是顺序和值都完全一模一样了。


为什么?


我们打开golang的源码,可以看到:




rand.Int()实际是func Int() int { return globalRand.Int() }

而globalRand是var globalRand = New(&lockedSource{src: NewSource(1)})

NewSource又是

func NewSource(seed int64) Source {

? ? var rng rngSource rng.Seed(seed)?

? ? return &rng?

}




也就是说,每次在默认随机的时候,golang是固定了以数字1作为种子,进行随机。那种子都固定了的话,每次执行的时候结果当然是一样的了。


而要解决这个问题,就需要以时间作为随机数种子。代码如下:




package main


import (

? ? "fmt"

? ? "math/rand"

? ? "time"

)


var c chan int


func product(){

? ? rand.Seed(int64(time.Now().Nanosecond()))

? ? r := rand.Intn(10)

? ? fmt.Println("随机数: ", r)

? ? c <- r

}


func main(){

? ? c = make(chan int, 8)

? ? for i:= 0; i<8; i++{

? ? ? ? go product()

? ? }

? ? total := 0

? ? for i:= 0; i<8; i++{

? ? ? ? total += <- c

? ? }

? ? fmt.Println("总和: ", total)

}




这时再运行,就会发现比较“随机”了。




? ?src go run index.go

随机数: ?8

随机数: ?1

随机数: ?3

随机数: ?9

随机数: ?6

随机数: ?8

随机数: ?5

随机数: ?7

总和: ?47

? ?src go run index.go

随机数: ?0

随机数: ?5

随机数: ?1

随机数: ?3

随机数: ?2

随机数: ?3

随机数: ?5

随机数: ?1

总和: ?20

? ?src go run index.go

随机数: ?2

随机数: ?9

随机数: ?8

随机数: ?2

随机数: ?5

随机数: ?1

随机数: ?9

随机数: ?0

总和: ?36

? ?src go run index.go

随机数: ?4

随机数: ?1

随机数: ?0

随机数: ?4

随机数: ?6

随机数: ?2

随机数: ?8

随机数: ?8

总和: ?33

? ?src go run index.go

随机数: ?0

随机数: ?3

随机数: ?5

随机数: ?1

随机数: ?1

随机数: ?6

随机数: ?5

随机数: ?6

总和: ?27




而PHP作为最好的语言,这点还是比较人性化的,PHP默认就是以时间作为种子的。在文档中有这么一句话:



Note: 自 PHP 4.2.0 起,不再需要用 srand() 或 mt_srand() 给随机数发生器播种 ,因为现在是由系统自动完成的。

以上就介绍了 关于golang随机数的一个好玩的事情,包括了方面的内容,希望对web前端有兴趣的朋友有所帮助。

本文网址链接:http://www.codes51.com/article/detail_4596425.html

上一篇Eclipse Memory Analyzer toolMAT使用详细说明 下一篇:没有了

相关图片

相关文章