mk-mode BLOG

このブログは自作の自宅サーバに構築した Debian GNU/Linux で運用しています。
PC・サーバ構築等の話題を中心に公開しております。(クローンサイト: GitHub Pages

ブログ開設日2009-01-05
サーバ連続稼働時間
Reading...
Page View 合計
Reading...
今日
Reading...
昨日
Reading...

Ruby - 一様乱数(線形合同法)!

[ プログラミング, 数学 ] [ Ruby ]

こんばんは。

昨日は、線形合同法を使用して一様乱数を生成する C++ によるアルゴリズムを紹介しました。

今日は、同じアルゴリズムを Ruby で実現してみました。 アルゴリズムについては、昨日の記事を参照してください。

実際、ほとんど同じです。

以下、Ruby によるサンプルスクリプトです。

記録

0. 前提条件

  • Cygwin 1.7.15
  • Ruby 1.9.3-p194

1. Ruby スクリプト作成

今回作成した Ruby ソースは以下の通りです。 【 ファイル名: 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
38
# -*- coding: utf-8 -*-
class RndnumLcgs
  # 各種定数定義
  A = 1103515245  # 乗数
  C = 12345       # 加数
  M = 2 ** 31     # 法
  N = 1000        # 発生させる乱数の個数

  # 計算クラス
  class Calc
    # コンストラクタ
    def initialize
      @r = 12345  # 乱数の種の初期値
    end

    # 一様乱数生成
    def generate_rndnum
      # ループしながら漸化式を計算
      0.upto( N ) do |i|
        @r = (A * @r + C) % M
        printf("%10d ", @r)
        print "\n" if i % 5 == 4
      end
    end
  end

  # メイン処理
  begin
    # 計算クラスインスタンス化
    obj_calc = Calc.new

    # 一様乱数生成
    obj_calc.generate_rndnum
  rescue => e
    # エラーメッセージ
    puts "[例外発生] #{e}"
  end
end

2. 実行

実際に実行して一様乱数を生成してみる。

1
2
3
4
5
6
7
8
9
10
11
12
$ ruby 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