關於 Golang 的亂數

https://ithelp.ithome.com.tw/articles/10193907

官方範例有展示 math/rand 的兩種用法,一種是全域的:

rand.Seed(time.Now().UnixNano())
fmt.Println(rand.Int())

另一種是用種子取得結構後,再開始產生亂數:

t := time.Now().UnixNano()
r1 := rand.New(rand.NewSource(t))
r2 := rand.New(rand.NewSource(t))

fmt.Println(r1.Int())
fmt.Println(r1.Int())
fmt.Println(r1.Int())
fmt.Println(r2.Int())
fmt.Println(r2.Int())
fmt.Println(r2.Int())



https://lihaoquan.me/2016/10/15/rand-in-go.html

使用golang生成随机数的时候,官方提供了两种方式,分别是 math/rand 和 crypo/rand ,那么它们两者之间究竟有什么 不同呢?如果通过它们来生成我们的随机数呢?

Go 的rand包:math/rand 和 crypo/rand, 前者是一种伪随机数生成方式,后者是真正意义上的随机数生成方式。

随机数至少具备两个条件: 数字序列在统计上是随机的 不能通过已知序列推算后面的序列 自从计算机诞生起,寻求用计算机产生高质量的随机数序列的研究就一直是研究者长期关注的课题。
一般情况下,使用计算机程序产生一个真正的随机数是很难的,因为程序的行为是可预测的,计算机利用设计好的算法结合用户提供的种子产生的随机数序列通常是“伪随机数”(pseudo-random number),伪随机数就是我们平时经常使用的“随机数”。伪随机数可以满足一般应用的需求,但是在对于安全要求比较高的环境和领域中存在明显的缺点:
例如:
1.伪随机数是周期性的,当它们足够多时,会重复数字序列
2.如果提供相同的算法和相同的种子值,将会得出完全一样的随机数序列
3.可以使用逆向工程,猜测算法与种子值,以便推算后面所有的随机数列
生成随机数是密码学中的一项基本任务,是生成加密密钥、加密算法和加密协议所必不可少的,随机数的质量对安全性至关重要。

总的来说math/rand是最简单的随机数,例如你要随机一个1-100之间的数字, 而crypto/rand是更加复杂的,例如beego里面的sessionid,他有一个很大的特点是不可预测。所以如果你要实现一些涉及安全的 上下文,建议还是使用crypto/rand, 如果只是简单生成随机数,math/rand是首选。

真隨機數,crypto/rand 的用法:https://blog.sqrtthree.com/articles/random-number-in-golang/
結果為 big int ,使用前需要進行各種轉換:https://medium.com/orbs-network/big-integers-in-go-14534d0e490d
https://golang.org/pkg/math/big/#Int.String
https://birdben.github.io/2017/01/10/Go/Go%E5%AD%A6%E4%B9%A0%EF%BC%88%E4%B8%89%EF%BC%89Go%E5%9F%BA%E6%9C%AC%E6%95%B0%E6%8D%AE%E7%B1%BB%E5%9E%8B%E6%80%BB%E7%BB%93/

程式語言編年史

程式語言編年史原文 下面這張圖片描繪了整個程式語言的歷史。包括各種程式語言的發明人、程式語言的特點和適用領域、被什麼網站或公司使用等 (檢視 完整高清圖 )。 之所以會有那麼多不同的程式語言是因為設計程式語言的初衷不同、對語言學習曲線的追求不同、不同程式之間的執行成本差異...