Ruby - 一様乱数(線形合同法)!
Updated:
昨日は、線形合同法を使用して一様乱数を生成する C++ によるアルゴリズムを紹介しました。
今日は、同じアルゴリズムを Ruby で実現してみました。
(アルゴリズムについては、昨日の記事を参照してください)
実際、ほとんど同じです。
以下、Ruby によるサンプルスクリプトです。
0. 前提条件
- Cygwin 1.7.15
- Ruby 1.9.3-p194
1. Ruby スクリプト作成
今回作成した Ruby ソースは以下の通りです。
File: rndnum_lcgs.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#! /usr/local/bin/ruby
#******************************
# 線形合同法による一様乱数生成
#******************************
class RndnumLcgs
# 各種定数定義
A = 1103515245 # 乗数
C = 12345 # 加数
M = 2 ** 31 # 法
N = 1000 # 発生させる乱数の個数
# コンストラクタ
def initialize
@r = C # 乱数の種の初期値
end
# 一様乱数生成
def generate_rndnum
0.upto( N ) do |i|
@r = (A * @r + C) % M
printf("%10d ", @r)
print "\n" if i % 5 == 4
end
print "\n"
rescue => e
raise
end
end
if __FILE__ == $0
begin
RndnumLcgs.new.generate_rndnum
rescue => e
$stderr.puts "[例外発生] #{e}"
end
end
2. 実行
まず、実行権限を付与。
$ chmod +x rndnum_lcgs.rb
そして、実行。
$ ./rndnum_lcgs.rb
1406932606 654583775 1449466924 229283573 1109335178
1051550459 1293799192 794471793 551188310 803550167
1772930244 370913197 639546082 1381971571 1695770928
2121308585 1719212846 996984527 1157490780 1343235941
536853562 1511588075 1538207304 2103497953 706568710
956612807 1521280756 1588911645 371038354 33727075
1680572000 88489753 1282976734 527630783 1194991756
1106424789 853518314 392166107 1387182456 1538766929
654858422 2086234551 1792144676 837716109 1513704002
269544019 1305165712 1179132041 1502988430 1941297327
:
アルゴリズムは昨日の C++ と同じなので、ロジックも同じようになっています。
やった事はなるべく記録しておきたい性格なので。。。
以上。
Comments