zoukankan      html  css  js  c++  java
  • 梅森旋转算法(Mersenne Twister)

    梅森旋转算法(Mersenne  Twister)也称马特赛特旋转算法。在python中的random模块就采用该算法计算随机数。

    梅森旋转算法Mersenne twister)是一个伪随机数发生算法。由松本真和西村拓士在1997年开发,基于有限二进制字段上的矩阵线性递归。可以快速产生高质量的伪随机数,修正了古典随机数发生算法的很多缺陷。

    最为广泛使用Mersenne Twister的一种变体是MT19937,可以产生32位整数序列。具有以下的优点:
    1. 周期非常长,达到2−1。尽管如此长的周期并不必然意味着高质量的伪随机数,但短周期(比如许多旧版本软件包提供的2)确实会带来许多问题。
    2. 在1 ≤k≤ 623的维度之间都可以均等分布(参见定义)。
    3. 除了在统计学意义上的不正确的随机数生成器以外,在所有伪随机数生成器法中是最快的(当时)
    整个算法主要分为三个阶段:
    第一阶段:获得基础的梅森旋转链;
    第二阶段:对于旋转链进行旋转算法;
    第三阶段:对于旋转算法所得的结果进行处理;

    算法实现的过程中,参数的选取取决于梅森素数,故此得名。

    python代码实现:

    def _int32(x):
        return int(0xFFFFFFFF & x)
    class MT19937:
        def __init__(self, seed):
            self.mt = [0] * 624
            self.mt[0] = seed
            for i in range(1, 624):
                self.mt[i] = _int32(1812433253 * (self.mt[i - 1] ^ self.mt[i - 1] >> 30) + i)
        def extract_number(self):
            self.twist()
            y = self.mt[0]
            y = y ^ y >> 11
            y = y ^ y << 7 & 2636928640
            y = y ^ y << 15 & 4022730752
            y = y ^ y >> 18
            return _int32(y)
        def twist(self):
            for i in range(0, 624):
                y = _int32((self.mt[i] & 0x80000000) + (self.mt[(i + 1) % 624] & 0x7fffffff))
                self.mt[i] = y ^ self.mt[(i + 397) % 624] >> 1
                if y % 2 != 0:
                    self.mt[i] = self.mt[i] ^ 0x9908b0df

    执行MT19937(seed=).extract_number()执行结果。

  • 相关阅读:
    1.4 build命令
    2.2-2 文章模块开发【添加文章页面脚本编写】
    2.2-1 文章模块开发 【入口脚本及模板的创建】
    2.1 开始一个项目 【功能梳理】
    [微信小程序]不在以下合法域名列表中
    [微信小程序]swiper保持宽高比
    爸爸一路走好
    LVM日记
    欲玩Discuz_X3.2,无奈不支持php7,再装个php5.3,编译到一半报错
    /sbin/ldconfig: /usr/local/lib64/libstdc++.so.6.0.22-gdb.py 不是 ELF 文件
  • 原文地址:https://www.cnblogs.com/austinjoe/p/9522389.html
Copyright © 2011-2022 走看看