CGI-BBS > CGI > Perl > 相異なる$x個の乱数をつくりたい


カレッヂ
カレッヂ


質問者 たにけい  投稿日 2004/1/18(日) 17:52:33
$xを数値変数として、$x個の相異なる乱数をつくりたいです。
いいアイデアはないですか?

プロバイダ参照:
サーバのOS:UNIXサーバ
パソコンのOS:WinNT系
エディタ:秀丸エディタ
FTPソフト:FFFTP
サーバ移転:していない
改造:(未選択) 改造前正常動作
CGI習熟度:expert

回答者 トンマ  [削除]  投稿日 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裏技