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()执行结果。

  • 相关阅读:
    想不明白为什么不复用老接口?
    dubbo入门教程-从零搭建dubbo服务
    使用Node.js时如何引入jQuery
    博客园在我的博客添加点击小心心特效
    博客园在微信内置浏览器打开时添加微信赞赏码功能
    Keepalived
    双网卡服务器使用指定网卡互通不同网段数据
    LNMP详解
    Centos7数据实时同步(Rsync+inotify)
    解决Centos7本机时间与实际时间相差8小时
  • 原文地址:https://www.cnblogs.com/austinjoe/p/9522389.html
Copyright © 2011-2022 走看看