内容简介:之前发现了golang标准库中又两个rand软件包,开始非常想知道他们之间的差异.Rob Pike的代码
1. 前言
原文地址
之前发现了golang标准库中又两个rand软件包,开始非常想知道他们之间的差异.
math/rand
软件包可以用于简单的游戏,但不能用于真正的随机性。
math/rand crypto/rand
Rob Pike的代码
package main import ( "fmt" "math/rand" "time" ) func main() { c := fanIn(boring("Joe"), boring("Ann")) for i := 0; i < 10; i++ { fmt.Println(<-c) } fmt.Println("You're both boring; I'm leaving.") } func boring(msg string) <-chan string { c := make(chan string) go func() { for i := 0; ; i++ { c <- fmt.Sprintf("%s %d", msg, i) time.Sleep(time.Duration(rand.Intn(1e3)) * time.Millisecond) } }() return c } // FAN IN func fanIn(input1, input2 <-chan string) <-chan string { c := make(chan string) go func() { for { c <- <-input1 } }() go func() { for { c <- <-input2 } }() return c }
2. Math/rand 伪随机数生成器
实现伪随机数生成器。
随机数由源生成。顶级函数(例如Float64和Int)使用默认的共享源,该源在每次运行程序时都会产生确定的值序列。 如果每次运行需要不同的行为, 请使用种子函数初始化默认的源。 默认的Source可安全地供多个goroutine并发使用,但不是由NewSource创建的Source。
package main import ( "fmt" "math/rand" "time" ) func init(){ rand.Seed(time.Now().UTC().UnixNano()) } func main() { // launches 2 generators and the fanIn collector function c := fanIn(genrt(), genrt()) for i := 0; i < 10000; i++ { fmt.Println(<-c) } } func fanIn(a <-chan int, b <-chan int) <-chan string { c := make(chan string) // launch collector from a to channel go func() { var count int for { count += <-a c <- fmt.Sprintf("Tally of A is: %d", count) } }() // launch collector from b to channel go func() { var count int for { count += <-b c <- fmt.Sprintf("Tally of B is: %d", count) } }() return c } func genrt() <-chan int { c := make(chan int) // launch generator of Dice rolls go func() { for i := 0; ; i++ { c <- rand.Intn(6) + 1 time.Sleep(time.Duration(500 * time.Millisecond)) } }() return c }
打印输出
... Tally of B is: 17656 Tally of A is: 17438 Tally of A is: 17440 Tally of B is: 17659 Tally of B is: 17660 Tally of A is: 17445
3. Crypto/rand 加密安全的随机数生成器
实现了加密安全的随机数生成器。
package main import ( "crypto/rand" "fmt" "math/big" "time" ) func main() { // launches 2 generatores and the fanIn collector function c := fanIn(genrt(), genrt()) for i := 0; i < 10000; i++ { fmt.Println(<-c) } } func fanIn(a <-chan int, b <-chan int) <-chan string { c := make(chan string) // launch collector from a to channel go func() { var count int for { count += <-a c <- fmt.Sprintf("Tally of A is: %d", count) } }() // launch collector from b to channel go func() { var count int for { count += <-b c <- fmt.Sprintf("Tally of B is: %d", count) } }() return c } func genrt() <-chan int { c := make(chan int) // launch generator of Dice rolls go func() { for i := 0; ; i++ { dice, err := rand.Int(rand.Reader, big.NewInt(6)) if err != nil { fmt.Println(err) } c <- int(dice.Int64()) + 1 time.Sleep(time.Duration(1 * time.Millisecond)) } }() return c }
打印输出
... Tally of B is: 17496 Tally of A is: 17570 Tally of A is: 17574 Tally of B is: 17500 Tally of B is: 17505 Tally of A is: 17576
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
CSS商业网站布局之道
朱印宏 / 清华大学出版社 / 2007-1 / 75.00元
本书是一本CSS技术专著。 主要从布局角度全面、系统和深入地讲解CSS在标准网站布局之中的应用。很多读者经过初步的学习之后就能够使用CSS设计出一些漂亮的网页样式,于是便乐在其中,踌躇满志,这是好事,但千万不要自我陶醉,因为你还未领略CSS的博大精深。用CSS容易,难的是全部都用CSS。CSS的精髓是布局,而不是样式,布局是需要缜密的逻辑思维和系统设计的,而样式只需要简单地编写代码或复制即可。本书......一起来看看 《CSS商业网站布局之道》 这本书的介绍吧!