![]() |
| カレッヂ |
質問者 たにけい
投稿日 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裏技 |