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++ と同じなので、ロジックも同じようになっています。
やった事はなるべく記録しておきたい性格なので。。。

以上。





 

Sponsored Link

 

Comments