カレッヂ |
質問者 たにけい
投稿日 2004/1/18(日) 17:52:33
$xを数値変数として、$x個の相異なる乱数をつくりたいです。 いいアイデアはないですか?
プロバイダ参照: |
回答者 トンマ
[削除]
投稿日 2004/1/18(日) 21:54:48
こんなかんじでしょうか? $x = 15; for($i = 0;$i < $x;$i++){ $value[$i] = int(rand(100)); } |
質問者 たにけい
[削除]
投稿日 2004/1/18(日) 22:03:43
返信ありがとうございます。しかし、このスクリプトではたとえば $value[1]と$value[2]がおなじ数字になる可能性があります。 そうではなくて、私は互いに異なる$x個の数字を作りたいのです。 つまり、2つ同じ数字があってもいけないわけです。 では、なにかよいアイデアをよろしくおねがいします。 |
回答者 トンマ
[削除]
投稿日 2004/1/18(日) 22:19:10
$x = 15; for($i = 0;$i < $x;$i++){ $temp = int(rand(100)); $flg = 1; foreach(@value){ if($_ == $temp){$i--;$flg = 0;} } if($flg){$value[$i] = $temp;} } これでどうでしょうか? もし、万が一 rand(100)の部分の100を$x以下にすると 無限ループします。 |
回答者 たにけい
[削除]
投稿日 2004/1/19(月) 02:33:47
全体的にスクリプトが理解できません。申し訳ないですがどなたか解説していただけないですか? |
回答者 しゅんじ
[削除]
投稿日 2004/1/19(月) 10:29:52
トンマさん、横槍すいません。 面白そうだったので、私も作ってみました。 use strict; my %SET; my @Array = (); my $x = 10; for (my $i=0; $i<$x; $i++) { my $temp = int(rand(1000)); while ($SET{$temp}) { $temp = int(rand(1000)); } $SET{$temp} = 1; push(@Array,$temp); } exit; 乱数一致の判定には、ハッシュ配列を使用しています。 while文で、乱数に一致するものがあれば、一致しなくなるまで、回します。 当たり前ですが、$xよりも乱数の数が少ないと無限ループです。 逆に乱数の数を増やすと、ループの数を少なく出来ます。 |
回答者 XXI
[削除]
投稿日 2004/1/19(月) 19:16:23
@s=(1..1000); # 出現数値の範囲 $x=100; # 取り出す数 for(my $i=0;$i<$x;$i++){$r=int(rand()*@s);@s[$i,$r]=@s[$r,$i];} print join",",@s[0..$x-1]; |
質問者 たにけい
[削除]
投稿日 2004/1/19(月) 19:20:13
みなさんいろいろアドバイスありがとうございました。 いりろ勉強になりました。 |
このページは終了したので返信(回答)は書きこめません
Web裏技 |