乱数の使用
■この章で解説する組み込み関数
rand, srand
■この章でできること
・乱数を作成する
・乱数のシードをセットする

 乱数はrand関数で取得することができます。乱数のシードはsrand関数でセットすることができます。ただし、C言語とは違い、srand関数を実行せずにrand関数を使用した場合、rand関数はデフォルトのシードでsrand関数を呼び出してくれます。ですので、必ずしもsrand関数を実行する必要はありません。

 逆に、プログラムを実行するたびに毎回同じ乱数系列で乱数を発生させたいような場合は、srand関数で特定のシードを指定します。

rand
0からnumまでの範囲(0 <= n < num)の乱数を返す。numを省略した場合は0から1までの範囲(0 <= n < 1)の乱数を返す。乱数は小数点以下の端数も含む。
書式
rand [num]
引数
num:
乱数の最大値
戻り値
乱数

srand
乱数のシードをセットする。exprを省略した場合は予測困難なシステム依存の値をいくつか組み合わせた値をデフォルトのシードとして使用する。
書式
srand [expr]
引数
expr:
乱数のシード
戻り値
乱数

 では、サンプルソースです。

#!/usr/bin/perl

#############################################
# 乱数のサンプル
# Author: "Perl Programming Tips"
#############################################

# 乱数のシードをセットする
srand time;

# 小数 範囲指定なし (0〜0.999...まで)
print "random float1: " . rand() . "\n";

# 小数 範囲指定あり (0〜9.999...まで)
print "random float2: " . rand(10) . "\n";

# 整数 範囲指定なし (0〜0まで)
print "random int1: " . int(rand()) . "\n";

# 整数 範囲指定あり (0〜9まで)
print "random int2: " . int(rand(10)) . "\n";

 実行結果は次のようになります。

[g@630m pl]$ perl math01_01.pl
random float1: 0.98370786647229
random float2: 4.95864366271661
random int1: 0
random int2: 7
[g@630m pl]$

 ここでは、乱数のシードとして現在時刻を使用しています。time関数は1970年1月1日からの経過秒数を返してくれます。

 rand関数が返す値は小数です。整数で取得したい場合は、int関数で整数部分を取得します。ただし、int関数は小数部分を切り捨てるので、rand関数で範囲を指定しなかった場合は、乱数は0〜0.999...となるので、整数部分は必ず0になります。