ASP源码.NET源码PHP源码JSP源码JAVA源码DELPHI源码PB源码VC源码VB源码Android源码
当前位置:首页 >> 低调看体育直播 >> 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使用详细说明 下一篇:没有了

相关图片

相关文章