Perlのsrandおよびrandについて

[上に] [前に] [次に]
tatuto [E-Mail] [HomePage] 2000/05/14(日) 05:01:40
Perlで乱数発生についてですが
例えば
@test1 = ('abc','cde','efg','def','bge');
@test2 = ('jdl','kdd','jhd','fdl','fjd');

$a = srand;$a = rand($#test1);$a = int;
$b = srand;$b = rand($#test2);$b = int;

とすると
必ず $a には@test1の4番目の要素
     $b にも@test2の4番目の要素が入ってしまします
なぜなんでしょうか?

tatuto [E-Mail] [HomePage] 2000/05/14(日) 05:04:47
申し訳ありません

必ず $a には@test1の4番目の要素
     $b にも@test2の4番目の要素が入ってしまします
の部分が
$aに4という値、$bにも4という値の間違いでした

sadahiro 2000/05/14(日) 12:43:56
これでは,$aにも0,$bにも0となるのではないのですか.
このコードでは$_に代入されるものがありませんので,
int すなわち int($_)は必ず0になるでしょう.

普通はこう書くのでは?
srand;
$a = int(rand($#test1));
$b = int(rand($#test2));

srandを2回(以上)呼び出すのも,srandに仕込む乱数の種
(ふつうは time となる,が最近のperlはもう少し複雑なものを使うらしい)
を変えないのなら(同じ結果を返すので)よろしくないでしょう.

sadahiro 2000/05/14(日) 13:27:26
>普通はこう書くのでは?
>srand;
>$a = int(rand($#test1));
>$b = int(rand($#test2));
上は間違いです(目的によっては構わないかもしれませんが).
上のコードでは$test1[$a]としても
$test1[4]が選ばれることがありません.

srand;
$a = int(rand(@test1));
$b = int(rand(@test2));
ですね.

明示的に書きたいなら,scalar関数を使います.
srand;
$a = int(rand(scalar @test1));
$b = int(rand(scalar @test2));

tatuto [E-Mail] [HomePage] 2000/05/16(火) 02:03:28
[[解決]]
> 明示的に書きたいなら,scalar関数を使います.
> srand;
> $a = int(rand(scalar @test1));
> $b = int(rand(scalar @test2));

なぜかsrand;を付けると同じ値しか返ってこないので
試しに
$a = int(rand(scalar @test1));
$b = int(rand(scalar @test2));

でやってみたところ、うまくいきました
レスありがとうございました

sadahiro 2000/05/16(火) 19:08:38
>srand;
補足しますと,Perl 5.004以上では
randを使えば自動的にsrandを呼び出して乱数の種をセットするのです.
もし.古いバージョンを考慮しなくていいのなら
たしかに srand; はなくて構いませんよね.

[上に] [前に] [次に]