平方取中方法是1946年由John Von Neumann,S. Ulm和N. Metropolis 在Los Alamos实验室研究中子碰撞时提出的,这是一种用来生成随机数的算法,但是因为存在致命的缺陷,因此不适合用在生产环境中。
go get -u github.com/cryptography-research-lab/middle-square-method
注:此算法过于久远,仅作为技术研究,已经不适合用于生产环境,请谨慎使用。
package main
import (
"fmt"
middle_square_method "github.com/cryptography-research-lab/middle-square-method"
)
func main() {
// 指定seed
//generator := middle_square_method.NewMiddleSquareMethodRandomGenerator(123456788)
// 不指定的话默认会把当前unix毫毛时间戳作为随机数序列的seed
generator := middle_square_method.NewMiddleSquareMethodRandomGenerator()
for i := 0; i < 10; i++ {
fmt.Println(generator.Next())
}
// Output:
// 8368732329101
// 5929387542414
// 5544795373933
// 112994856646
// 2690729443080
// 9928319934722
// 3156013888483
// 1967977745017
// 5593118728487
// 833319471388
}
- 选择一个m位的数字作为随机数种子seed
- 把seed开方,得到结果r = seed * seed
- 如果r的位数不足2*m位,则左边补0到2 * m 位
- 然后取中间的m位作为生成的结果,同时作为下一次生成的seed
- 如此往复,便能生成随机数序列
当多次生成的时候可能会退化为0
TODO 证明退化为0的过程