scala版本的梅森旋转随机数算法
来源:互联网 发布:知进退呼为神 编辑:程序博客网 时间:2024/05/17 03:53
package xzxzimport scala.annotation.tailrecclass MersenneTwister(seed: Int) { private val SIZE: Int = 624 private val PERIOD: Int = 397 private val DIFF: Int = SIZE - PERIOD private def isOdd(n: Int): Int = n & 1 private def m32(n: Int): Int = 0x80000000 & n private def l31(n: Int): Int = 0x7FFFFFFF & n private val mersenneTwister = new Array[Int](SIZE) private var index: Int = 0 resetSeed(seed) private def generateNumbers(): Unit = { @tailrec def rollMersennerTwister(i: Int): Unit = { if (i < DIFF) { val y = m32(mersenneTwister(i)) | l31(mersenneTwister(i + 1)) mersenneTwister(i) = mersenneTwister(i + PERIOD) ^ (y >>> 1) ^ (isOdd(y) * 0x9908b0df) rollMersennerTwister(i + 1) } } rollMersennerTwister(0) def unroll(i: Int): Unit = { val y = m32(mersenneTwister(i)) | l31(mersenneTwister(i + 1)) mersenneTwister(i) = mersenneTwister(i - DIFF) ^ (y >>> 1) ^ (isOdd(y) * 0x9908b0df) } @tailrec def startUnroll(i: Int): Unit = { if (i < SIZE - 1) { @tailrec def doUnroll(j: Int): Unit = { if (j < 11) { unroll(i) doUnroll(j + 1) } } startUnroll(i + 1) } } startUnroll(DIFF + 1) val y = m32(mersenneTwister(SIZE - 1)) | l31(mersenneTwister(SIZE - 1)); mersenneTwister(SIZE - 1) = mersenneTwister(PERIOD - 1) ^ (y >>> 1) ^ (isOdd(y) * 0x9908b0df); } final def resetSeed(seed: Int): Unit = { mersenneTwister(0) = seed index = 0; @tailrec def getmersenneTwister(i: Int): Unit = { if (i < SIZE) { mersenneTwister(i) = 0x6c078965 * (mersenneTwister(i - 1) ^ mersenneTwister(i - 1) >>> 30) + i; getmersenneTwister(i + 1) } } getmersenneTwister(1) } /** * 生成 [0.0, 1.0) 范围内的随机数 */ final def nextFloat(): Double = (nextInt() + 2147483648.0) / 4294967296.0 final def nextInt(): Int = { if (index == 0) generateNumbers() var res: Int = mersenneTwister(index) res ^= res >>> 11 res ^= res << 7 & 0x9d2c5680 res ^= res << 15 & 0xefc60000 res ^= res >>> 18 index = index + 1 if (index == SIZE) index = 0 res }}
1 0
- scala版本的梅森旋转随机数算法
- 【随机数生成算法系列】线性同余法和梅森旋转法
- 梅森旋转算法--伪随机数(加密、身份信息ID号)
- 伪随机数生成——梅森旋转(Mersenne Twister/MT)算法笔记
- 梅森旋转法产生随机数
- 梅森旋转随机数生成实例
- 梅森旋转算法
- scala随机数生成,生成一组不重复随机数算法
- scala版本的wordCount
- 梅森旋转随机算法
- Scala<产生min-max之间的随机数>
- 交换*号到第一位的partition算法和不改变数字位置的算法 scala版本
- 取随机数的算法
- 随机数的算法分析
- Scala 版本的svm库
- scala BitSet实现算法:一千万个随机数,随机数范围在1到1亿之间,现在要求写出一种算法,将1到1亿之间没有出现的随机数求出来
- scala BitSet实现算法:一千万个随机数,随机数范围在1到1亿之间,现在要求写出一种算法,将1到1亿之间没有出现的随机数求出来
- 矩阵旋转的算法
- 尼姆博弈
- Android 获取设备信息
- poj 3083 深搜+广搜
- 05-3. 六度空间 (30)
- 均均阅读app
- scala版本的梅森旋转随机数算法
- Markdown 学习
- C#生成验证码
- opencv kmans 小结
- Partition List (Java)
- 取(m堆)石子游戏(尼姆博弈)
- E: 无法获得锁 /var/lib/apt/lists/lock - open (11: 资源暂时不可用)
- [慢查优化]联表查询注意谁是驱动表 & 你搞不清楚谁join谁更好时请放手让mysql自行判定
- 用apktool批量反编译apk文件