randのばらつきを見るテストメソッドをirbに追加

別に1日1メソッドをirbrcファイルに定義して、追加していくとか、そんなつもりはない。

自分をよほど暇人だなと思いながら、
randって数字どのくらいばらつくのかなーって眺められるメソッド追加。


デフォルトでは10回、0.6秒(sleep)毎に表示。
オプションにより、seedを与えて発生する数字を調整したり、表示回数・sleep秒数変えられる。

単なる娯楽的な感じ。
ただ、randの数値バラ付き具合が気になる人は定義しておけばちょっとした確認は出来ます。

  #10回くらいRand発生させてばらつきを見るだけ
  #optionは
  #:seed      srand(seed)を与える場合。基本は数字。文字列は文字コードの数字として与える。数値・文字以外だとsrand使わない
  #:count     何回表示させるか(デフォルト10回)
  #:sleep_time  1回の表示に何秒間隔を空けるか(デフォルト0.6秒)
  def rand_test(rand_arg = nil, options = {})
    seed = options.has_key?(:seed) ? options[:seed] : nil
    count = options.has_key?(:count) ? options[:count].to_i : 10
    sleep_time = options.has_key?(:sleep_time) ? options[:sleep_time].to_f : 0.6

    if seed.is_a?(Fixnum) || seed.is_a?(String)
      if seed.class == Fixnum
        srand(seed)
      else
        #文字コードの数字を連結してseedに与える
        srand(seed.split(//).map{|str| str[0]}.join.to_i)

        #injectで文字コードの数字合計をseedに与える場合
        #srand(seed.split(//).map{|str| str[0]}.inject(0){|sum,x| sum + x})
      end
    else
      seed = nil
    end

    count.times do
      p rand(rand_arg)
      sleep(sleep_time)
    end
  end

あとは実行結果はかかないけれども

rand_test
rand_test(10)

rand_test(nil, {:seed => 5939204401})
rand_test(100, {:seed => "hogehogeAIUEO"})

とかやると、何となくニヤニヤ。


srandの引数seedですが
「1.8.3 からは、seed として unsigned long よりも大きな値を与えることが出来ます」
とのこと。


結構長い文字列を与えて、
文字列文字コードを連結してもセーフってことかな。

rand_test(100, {:seed => "かなり長い文字列"*100})
とかしても、セーフだった。


100かけてる部分を、
99にしたら、ちゃんと変わるし、どこまで受け付けるんだろうね。すげー。

もし長い文字列でエラーが出るようなら、
文字コード連結じゃなくて、文字コード数値にした配列にmapで変換した後、
join.to_iじゃなくて、injectでコードの数字を加算した値にする処理入れようかと思ったけどいらなそう。


くだらないけど、Rubyの柔軟性はいいよね。
そんなに深い知識があるとはまだまだいえないけれども。
irbも楽しい。