• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:ランダムに数字選択)

ランダムに数字選択する方法と条件

このQ&Aのポイント
  • Perl初心者のため、ランダムに数字選択する方法と条件について教えてください。
  • 具体的な要件は、1~8の数字の中から6つの数字をランダムに選び、6,7,8は1つしか選ばれないようにし、かつ3番目か4番目に入れたいです。
  • 質問者は既に8つの数字のランダムな並びを作る方法を知っており、それに追記して要件を実現したいと考えています。

質問者が選んだベストアンサー

  • ベストアンサー
  • N60-BASIC
  • ベストアンサー率80% (17/21)
回答No.2

先越されちゃいましたけど、書いちゃったので投げておきます。 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;

kujitan
質問者

お礼

ご回答有難うございます。 コメント付きで書いていただいたお陰で、大変良く分かり、こちらを参考にさせていただいて解決いたしました。 本当にありがとうございました。

その他の回答 (2)

  • shiren2
  • ベストアンサー率47% (139/295)
回答No.3

脳のクールダウンに書いてみました。 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));

kujitan
質問者

お礼

ご回答有難うございます。 kmeeさんの回答と併せて理解することができ、大変助かりました。 ありがとうございました。

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.1

(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 ) ;

kujitan
質問者

お礼

ご回答有難うございます。 考え方がよく分かり、自分の中で整理することができました。 大変ありがとうございました。

関連するQ&A