'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