2010-03-18 90 views
2

Mersenne Twister和Python中的其他好隨機數生成器有什麼好的開源實現?我想用於教數學和計算機專業嗎?我也在尋找相應的理論支持。 Mersenne Twister的源代碼很容易以各種語言提供,例如C(random.py)或僞代碼(維基百科),但我在Python中找不到一個。Python中Mersenne Twister的開源實現?

回答

7

Mersenne Twister 標準python庫使用的實現。你可以在你的python發行版的random.py文件中看到它。

在我的系統(Ubuntu的9.10),它是在/usr/lib/python2.6,在Windows上應該在C:\Python26\Lib

+7

實際梅森倍捻機代碼不在random.py中,但是; random.py指的是用於實際隨機數生成的C庫。 – lacker 2010-05-27 18:41:21

5

Found以下端口:

#!/usr/bin/python 

## a C -> python translation of MT19937, original license below ## 

## A C-program for MT19937: Real number version 
## genrand() generates one pseudorandom real number (double) 
## which is uniformly distributed on [0,1]-interval, for each 
## call. sgenrand(seed) set initial values to the working area 
## of 624 words. Before genrand(), sgenrand(seed) must be 
## called once. (seed is any 32-bit integer except for 0). 
## Integer generator is obtained by modifying two lines. 
## Coded by Takuji Nishimura, considering the suggestions by 
## Topher Cooper and Marc Rieffel in July-Aug. 1997. 

## This library is free software; you can redistribute it and/or 
## modify it under the terms of the GNU Library General Public 
## License as published by the Free Software Foundation; either 
## version 2 of the License, or (at your option) any later 
## version. 
## This library is distributed in the hope that it will be useful, 
## but WITHOUT ANY WARRANTY; without even the implied warranty of 
## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 
## See the GNU Library General Public License for more details. 
## You should have received a copy of the GNU Library General 
## Public License along with this library; if not, write to the 
## Free Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 
## 02111-1307 USA 

## Copyright (C) 1997 Makoto Matsumoto and Takuji Nishimura. 
## Any feedback is very welcome. For any question, comments, 
## see http://www.math.keio.ac.jp/matumoto/emt.html or email 
## [email protected] 


import sys 

# Period parameters 
N = 624 
M = 397 
MATRIX_A = 0x9908b0dfL # constant vector a 
UPPER_MASK = 0x80000000L # most significant w-r bits 
LOWER_MASK = 0x7fffffffL # least significant r bits 

# Tempering parameters 
TEMPERING_MASK_B = 0x9d2c5680L 
TEMPERING_MASK_C = 0xefc60000L 

def TEMPERING_SHIFT_U(y): 
    return (y >> 11) 

def TEMPERING_SHIFT_S(y): 
    return (y << 7) 

def TEMPERING_SHIFT_T(y): 
    return (y << 15) 

def TEMPERING_SHIFT_L(y): 
    return (y >> 18) 

mt = [] # the array for the state vector 
mti = N+1 # mti==N+1 means mt[N] is not initialized 

# initializing the array with a NONZERO seed 
def sgenrand(seed): 
    # setting initial seeds to mt[N] using 
    # the generator Line 25 of Table 1 in 
    # [KNUTH 1981, The Art of Computer Programming 
    # Vol. 2 (2nd Ed.), pp102] 

    global mt, mti 

    mt = [] 

    mt.append(seed & 0xffffffffL) 
    for i in xrange(1, N + 1): 
    mt.append((69069 * mt[i-1]) & 0xffffffffL) 

    mti = i 
# end sgenrand 


def genrand(): 
    global mt, mti 

    mag01 = [0x0L, MATRIX_A] 
    # mag01[x] = x * MATRIX_A for x=0,1 
    y = 0 

    if mti >= N: # generate N words at one time 
    if mti == N+1: # if sgenrand() has not been called, 
     sgenrand(4357) # a default initial seed is used 

    for kk in xrange((N-M) + 1): 
     y = (mt[kk]&UPPER_MASK)|(mt[kk+1]&LOWER_MASK) 
     mt[kk] = mt[kk+M]^(y >> 1)^mag01[y & 0x1] 

    for kk in xrange(kk, N): 
     y = (mt[kk]&UPPER_MASK)|(mt[kk+1]&LOWER_MASK) 
     mt[kk] = mt[kk+(M-N)]^(y >> 1)^mag01[y & 0x1] 

    y = (mt[N-1]&UPPER_MASK)|(mt[0]&LOWER_MASK) 
    mt[N-1] = mt[M-1]^(y >> 1)^mag01[y & 0x1] 

    mti = 0 

    y = mt[mti] 
    mti += 1 
    y ^= TEMPERING_SHIFT_U(y) 
    y ^= TEMPERING_SHIFT_S(y) & TEMPERING_MASK_B 
    y ^= TEMPERING_SHIFT_T(y) & TEMPERING_MASK_C 
    y ^= TEMPERING_SHIFT_L(y) 

    return (float(y)/0xffffffffL) # reals 


def main(): 
    sgenrand(4357) # any nonzero integer can be used as a seed 
    for j in xrange(100): 
     sys.stdout.write('%5f ' % genrand()) 
     if (j%8) == 7: 
      print 
    print 

main() 

不是很Python的,但工程

+0

這與目前的維基百科代碼在初始化狀態方面也有所不同。 – 2013-04-27 02:23:15