FreeBASIC マニュアルのトップに戻る

FreeBASIC メルセンヌ・ツイスタ乱数 for 64 bit machines

目次→フォーラム→FreeBASIC→補足Mersenne Twister for 64 bit machines←オリジナル・フォーラム

メルセンヌ・ツイスタ乱数 左にメニュー・フレームが表示されていない場合は、ここをクリックして下さい

←リンク元に戻る プログラム開発関連に戻る

 srvaldez さんが、
松本眞さんの 64bit版 Mersenne Twister
http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/mt64.html
を FreeBASIC に移植して公開しているプログラムです。
出力結果が下記と同じになれば正解です?
http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/mt19937-64.out.txt

参考:
 Mersenne Twister Home Page
http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/mt.html
 あなたの使っている乱数、大丈夫?
http://www.math.sci.hiroshima-u.ac.jp/~m-mat/TEACH/ichimura-sho-koen.pdf
 メルセンヌ・ツイスタ
https://ja.wikipedia.org/wiki/%E3%83%A1%E3%83%AB%E3%82%BB%E3%83%B3%E3%83%8C%E3%83%BB%E3%83%84%E3%82%A4%E3%82%B9%E3%82%BF
 メルセンヌ・ツイスタをわかった気になる
https://narusejun.com/archives/5/

 メルセンヌ数
https://ja.wikipedia.org/wiki/%E3%83%A1%E3%83%AB%E3%82%BB%E3%83%B3%E3%83%8C%E6%95%B0


このプログラムの紹介について、著作権者 松本眞 さんのご了解をいただいています。有難うございます。
'Mersenne Twister for 64 bit machines
'https://www.freebasic.net/forum/viewtopic.php?t=26587
'by srvaldez ≫ Apr 09, 2018 12:25 
'
'http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/mt64.html

'オリジナル・ソース:MTのホームページ
'http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/mt.html

/' 
   A C-program for MT19937-64 (2004/9/29 version).
   コード作成:西村拓士と松本眞

   これは、Mersenne Twister 擬似乱数発生器の 64ビット版です。

   使う前に、以下を使って状態を初期化します。
   init_genrand64(seed)init_by_array64(init_key, key_length)

   Copyright (C) 2004, Makoto Matsumoto and Takuji Nishimura,
   All rights reserved.                          

   ソースおよびバイナリ形式での再配布および使用は、変更の有無にかかわらず、
   次の条件が満たされていれば許可されます:

     1. ソースコードの再配布には、上記の著作権表示、この条件リスト、
        および以下の免責事項を保持する必要があります。

     2. バイナリ形式での再配布では、上記の著作権表示、この条件リスト、
        および以下の免責事項を、配布物とともに提供される文書 and/or
        その他の資料に複製する必要があります。

     3. このソフトウェアから派生した製品を推奨または宣伝するために、
        貢献者の名前を使いたい場合は、
        事前に書面による具体的な許可が必要です。

   このソフトウェアは、著作権者および貢献者によって「現状のまま」提供されます。
   商品性および特定の目的への適合性の黙示的な保証はもちろん、
   さらにこれに限定されない明示的または黙示的な保証はいっさい責任は持てません。

   いかなる場合でも、著作権所有者または貢献者は、
   直接的、間接的、偶発的、特別、例示的、または結果的損害
   (代替品またはサービスの調達、使用、データ、または利益の損失、
   または業務中断を含むが、これらに限定されない)に対して、
   原因の如何を問わず、どんな責任の理論に関してでも、
   または不法行為(過失またはその他を含む)にかかわらず、
   責任を負わないものとします。
   このソフトウェアの使用から生じる可能性がある場合でも、
   この損害の可能性について知らされていたとしてもです。

   参考:
   T. Nishimura, ``Tables of 64-bit Mersenne Twisters''
     ACM Transactions on Modeling and 
     Computer Simulation 10. (2000) 348--357.
   M. Matsumoto and T. Nishimura,
     ``Mersenne Twister: a 623-dimensionally equidistributed
       uniform pseudorandom number generator''
     ACM Transactions on Modeling and 
     Computer Simulation 8. (Jan. 1998) 3--30.

   なんでも結構ですから、お知らせ下さい。
   http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/mt.html
   メイル: m-mat @ math.sci.hiroshima-u.ac.jp (@の前後のスペースは除いて)
'/



Declare Sub main() 'as long
main()
Sleep
End

Declare Sub init_genrand64(ByVal seed As ULongInt)
Declare Sub init_by_array64(ByVal init_key As ULongInt Ptr, ByVal key_length As ULongInt)
Declare Function genrand64_int64() As ULongInt
#define genrand64_int63() CLngInt(genrand64_int64() Shr 1)
#define genrand64_real1() CDbl((genrand64_int64() Shr 11) * (1.0 / 9007199254740991.0))
#define genrand64_real2() CDbl((genrand64_int64() Shr 11) * (1.0 / 9007199254740992.0))
#define genrand64_real3() CDbl(((genrand64_int64() Shr 12) + 0.5) * (1.0 / 4503599627370496.0))

Const NN = 312
Const MM = 156
Const MATRIX_A = &hB5026F5AA96619E9ULL
Const UM = &hFFFFFFFF80000000ULL
Const LM = &h7FFFFFFFULL
Dim Shared mt(0 To NN-1) As ULongInt
Dim Shared mti As Long = NN + 1

Private Sub main() 'as long
   Dim i As Long
   Dim init(0 To 3) As ULongInt = {&h12345ULL, &h23456ULL, &h34567ULL, &h45678ULL}
   Dim length As ULongInt = 4
   init_by_array64(@init(0), length)
   'Print "1000 outputs of genrand64_int64()"
   Print "genrand64_int64() で 1,000 個出力"
   For i=0 To 999
      Print Using "#####################";genrand64_int64();
      If i Mod 5=4 Then
         Print
      End If
   Next
   Print
   'Print "1000 outputs of genrand64_real2()"
   Print "genrand64_real2() で 1,000 個出力"
   For i=0 To 999
      Print Using "#.######## "; genrand64_real2();
      If i Mod 5=4 Then
         Print
      End If
   Next
   'return 0
End Sub 'function

Private Sub init_genrand64(ByVal seed As ULongInt)
   mt(0) = seed
   For mti = 1 To NN - 1
      mt(mti) = (6364136223846793005ULL * (mt(mti-1) Xor (mt(mti-1) Shr 62)) + mti)
   Next
End Sub

Private Sub init_by_array64(ByVal init_key As ULongInt Ptr, ByVal key_length As ULongInt)
   Dim i As ULongInt
   Dim j As ULongInt
   Dim k As ULongInt
   init_genrand64(19650218ULL)
   i = 1
   j = 0
   k = IIf(NN > key_length, NN, key_length)
   Do While k <> 0
      mt(i) = (mt(i) Xor ((mt(i-1) Xor (mt(i-1) Shr 62)) * 3935559000370003845ULL)) + init_key[j] + j ' non linear
      i += 1
      j += 1
      If i>=NN Then
         mt(0) = mt(NN-1)
         i = 1
      End If
      If j>=key_length Then
         j = 0
      End If
      k -= 1
   Loop
   For k = NN-1 To 1 Step -1
      mt(i) = (mt(i) Xor ((mt(i-1) Xor (mt(i-1) Shr 62)) * 2862933555777941757ULL)) - i ' non linear
      i += 1
      If i>=NN Then
         mt(0) = mt(NN-1)
         i = 1
      End If
   Next
   mt(0) = 1ULL Shl 63
End Sub

Private Function genrand64_int64() As ULongInt
   Dim i As Long
   Dim x As ULongInt
   Static mag01(0 To 1) As ULongInt = {0ULL, &hB5026F5AA96619E9ULL}
   If mti >= NN Then
      If mti = (NN + 1) Then
         init_genrand64(5489ULL)
      End If
      For i=0 To NN-MM-1
         x = (mt(i) And UM) Or (mt(i+1) And LM)
         mt(i) = mt(i+MM) Xor (x Shr 1) Xor mag01(CInt(x And 1ULL))
      Next
      Do While i<NN-1
         x = (mt(i) And UM) Or (mt(i+1) And LM)
         mt(i) = mt(i+(MM-NN)) Xor (x Shr 1) Xor mag01(CInt(x And 1ULL))
         i += 1
      Loop

      x = (mt((NN - 1)) And &hFFFFFFFF80000000ULL) Or (mt(0) And &h7FFFFFFFULL)
      mt((NN - 1)) = (mt((MM - 1)) Xor (x Shr 1)) Xor mag01(CLng(x And 1ULL))
      mti = 0
   End If

   x = mt(mti)
   mti += 1

   x Xor= (x Shr 29) And &h5555555555555555ULL
   x Xor= (x Shl 17) And &h71D67FFFEDA60000ULL
   x Xor= (x Shl 37) And &hFFF7EEE000000000ULL
   x Xor= x Shr 43
   Return x
End Function
 
補足 に戻る
←リンク元に戻る プログラム開発関連に戻る
ページ歴史:2020-03-11 作成:2020-03-11
日本語翻訳:WATANABE Makoto、原文著作者:西村拓士、松本眞、srvaldez

ホームページのトップに戻る

表示-非営利-継承