- ベストアンサー
ランダムに数字選択する方法と条件
- Perl初心者のため、ランダムに数字選択する方法と条件について教えてください。
- 具体的な要件は、1~8の数字の中から6つの数字をランダムに選び、6,7,8は1つしか選ばれないようにし、かつ3番目か4番目に入れたいです。
- 質問者は既に8つの数字のランダムな並びを作る方法を知っており、それに追記して要件を実現したいと考えています。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
先越されちゃいましたけど、書いちゃったので投げておきます。 use strict; use warnings; my @group1 = (1..5); my @group2 = (6..8); # 出力バッファ@bufに@group1をコピー my @buf = @group1; # @bufをランダムに並べ替える for(my $i=@buf; $i>0; $i--) { my $r = int(rand($i)); ($buf[$i-1], $buf[$r]) = ($buf[$r], $buf[$i-1]); } # @group2から1つ選んで@bufの末尾に追加 push(@buf, $group2[int(rand(@group2))]); # @bufの先頭の2個または3個を@bufの最後尾に移動する push(@buf, splice(@buf, 0, 2 + int(rand(2)))); # @bufをカンマでつなぐ my $q_list = join(',', @buf); print $q_list;
その他の回答 (2)
- shiren2
- ベストアンサー率47% (139/295)
脳のクールダウンに書いてみました。 No1さんの回答をそのまま実装しただけです。 ちゃんとした環境であればコメントをつけたほうがいいですね。 use strict; use List::Util qw/shuffle/; my @n = &shuffle(1 .. 5); splice(@n, 2+int(rand(2)), 0, 6+int(rand(3))); printf("%s\n", join(",", @n));
お礼
ご回答有難うございます。 kmeeさんの回答と併せて理解することができ、大変助かりました。 ありがとうございました。
- kmee
- ベストアンサー率55% (1857/3366)
(i) 1,2,3,4,5 を並び換える (ii) 3か4を(乱数で)決める (iii) 6,7,8を(乱数で)決める (iv) (ii)の場所に(iii)を挿入する または、(ii)にある値を6番目にして、(ii)番目の値を(iii)にする。 並び換えを作るのに、今のプログラムでも、トランプのシャフルのような (1)全部用意する (2)ランダムに入れ替える (3)適当な回数、(2)を繰り返す という方法だと確実です。 「シャッフル アルゴリズム」で検索すれば例も見つかります。 > my $q_list = ""; > for(my $loop=1;$loop<=8;$loop++){ ... リストのスライスとjoin関数を使えば my $q_list = join(',', @buf2[1..8] ) ; @buf2の添字を0から使うようにすれば my $q_list = join(',', @buf2 ) ;
お礼
ご回答有難うございます。 考え方がよく分かり、自分の中で整理することができました。 大変ありがとうございました。
お礼
ご回答有難うございます。 コメント付きで書いていただいたお陰で、大変良く分かり、こちらを参考にさせていただいて解決いたしました。 本当にありがとうございました。