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; はなくて構いませんよね.
[上に]
[前に]
[次に]