マクロ定数とか乱数とか

昨日久しぶりに勉強したら非道い… - rindai87の日記ごちゃごちゃと触ってて、RAND_MAXとかEXIT_SUCCESSとか出てきて何ぞやと思ったので調べてみた。
というか出力してみた。

  1include <stdio.h>
  2 #include <stdlib.h>
  3 
  4 int main(void)
  5 {
  6   printf("RAND_MAX:%d\n", RAND_MAX);
  7   printf("EXIT_SUCCESS:%d\n", EXIT_SUCCESS);
  8   printf("EXIT_FAILURE:%d\n", EXIT_FAILURE);
  9 
 10   return(0);
 11 }

結果

% ./a.out
RAND_MAX:2147483647
EXIT_SUCCESS:0
EXIT_FAILURE:1

EXIT_SUCCESSとEXIT_FAILUREの結果が意外だったなぁ
EXIT_SUCCESSはともかく、EXIT_FAILUREが1とは。
名前的にはエラーを返すっぽいので、-1とかかなぁと漠然と思ってた。

で、Rubyで乱数を生成

前置きが長くなったけど、要はRubyでの乱数発生を知りたかっただけです。

rand([max=0])
    0 以上 max 未満の範囲の整数の乱数を発生します。まだsrand が呼ばれていなければ自動的に srand を呼び出します。
    max に nil または 0 を指定すると 0 以上 1 未満の実数値 Float で乱数を与えます。
[http://www.ruby-lang.org/ja/man/html/_C1C8A4DFB9FEA4DFB4D8BFF4.html#rand:title]
rand([seed])
    rand の乱数の種を設定し、古い初期値を返します (ただし最初だけは0を返します)。初期値が省略された時には現在の時刻やプロセスID、srand を呼び出した回数、また可能なら /dev/urandom から読み出したデータなどを元に種を作ります。
    ruby 1.8 feature: 1.8.3 からは、seed として unsigned long よりも大きな値を与えることが出来ます。
[http://www.ruby-lang.org/ja/man/html/_C1C8A4DFB9FEA4DFB4D8BFF4.html#srand:title]

というわけで

  1 10.times{
  2   puts rand(10)
  3 }
  4 
  5 10.times{
  6   puts rand()
  7 }

実行結果

% ruby rand.rb
3
3
8
4
3
2
5
0
5
0
0.726017834873518
0.763920861714683
0.202320355136787
0.1997201628689
0.981222439043529
0.627212393498063
0.986392114567631
0.758848067260233
0.382752910655566
0.583578292919741

srandまで勝手に処理してくれて、Cと比べるとRubyは楽ですね〜
当たり前だけど。


srandにunsigned longより大きい種を食わせることができるようになるとどう嬉しいのか?とか、若干気になる箇所がいくつかあるけど、本題から離れていきそうなのでスルー。
明日以降にバブルソートRuby版にチャレンジしてみようっと。