'種を使って初期化できます。116よりさらに2倍程度高速になりました
Private Const p32 = 2# ^ 32, p31 = 2# ^ 31, p21 = 2# ^ 21, p11 = 2# ^ 11
Private Const m53 = 2# ^ -53, m32 = 2# ^ -32, m30 = 2# ^ -30, m19 = 2# ^ -19, m11 = 2# ^ -11, m8 = 2# ^ -8
Private x, y, z, w As Double
Private f As Boolean
Private Function uXor(ByVal x As Double, ByVal y As Double) As Double
Dim u, v As Long
If x >= p31 Then u = x - p32 Else u = x
If y >= p31 Then v = y - p32 Else v = y
u = u Xor v
If u < 0 Then uXor = u + p32 Else uXor = u
End Function
Private Function XSub(ByVal x As Double, ByVal i As Long) As Double
Dim s As Variant
s = CDec(1812433253) * CDec(uXor(x, Int(x * m30))) + CDec(i): s = s - CDec(Int(s * m32)) * CDec(p32): XSub = s
End Function
Public Sub InitXor(ByVal s As Long) ' s を種にして乱数を初期化する
f = True: x = XSub(s, 1): y = XSub(x, 2): z = XSub(y, 3): w = XSub(z, 4)
End Sub
Private Function NextXor() As Double
Dim t As Double
If f = 0 Then InitXor (1)
t = x * p11: t = t - Int(t * m32) * p32: t = uXor(x, t): x = y: y = z: z = w: t = uXor(t, Int(t * m8)): w = uXor(uXor(w, Int(w * m19)), t): NextXor = w
End Function
Public Function NextUnif() As Double ' 0 以上 1 未満の乱数を返す
Dim x, y As Double
x = NextXor * m11: y = NextXor: NextUnif = (y * p21 + Int(x)) * m53
End Function
ニュース
- 日本のGDP、世界6位転落へ…薬物もやらない勤勉な日本人が貧しくなる屈辱は“完全な政策ミス”か? [ぐれ★]
- 【一体何が?】21日夜に「緊急メンテナンス」続々 業務ツール、ソシャゲ、通販、自治体Webサイトなど★4 [夜のけいちゃん★]
- 歌舞伎俳優中村児太郎が傷害容疑で逮捕されていた 松竹は「弊社から申し上げられることはございません」 [征夷大将軍★]
- 【新潟】「交通遺児のために」月光仮面を名乗る人物から寄付金 総額539円 [あずささん★]
- 女性支持減「期待感が失望に」 申お茶の水大教授―高市政権1年 [蚤の市★]
- 小学校より多い郵便局に年650億円 統廃合「怖くて口にもできず」 [蚤の市★]
- 【速報】革ジャンの季節、来たぞ!!!!!!!!wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww [683137174]
- ブロッコリーについて知ってること [114588277]
- 【悲報】退職者続出で残された会社員、泣く『辞めた人の分の業務が全部自分に回ってくる😭』 [315293707]
- ぺこーら【兎田ぺこら】結婚…か? [841411289]
- 高市早苗「PHPかヤバいわよ!!」太田光代「家のwifiを切る対策を取るわよ!!!」wifiさんが何したっていうんですか…… [624898991]
- 【悲報】大阪大学「NECにシステム任せよう」NEC「安い下請けにシステム任せよう」→情報漏洩 [177316839]