Perl初心者です。
1~8のうちの数字のランダムな並び変えと、その中から以下の条件で数字を6つ選びたいのですが、方法が分からず、ご教示いただければ幸いです。
やりたいのは、
1)1~8から6つの数字を選びたい。
2)数字のうち、6,7,8は1つしか選ばれないようにして、かつ3番目か4番目に入るようにしたい
です。
たとえば、
2,3,6,1,4,5(6が選ばれて3番目に)
4,5,3,8,1,2(8が選ばれて4番目に)
1,3,7,2,5,4(7が選ばれて3番目に)
等の結果が得られることを期待しています。
ちなみに、単純に8つの数字のランダムを作るときは以下のように記述していました。
可能であれば、これにどう追記したら上記のことが実現できるかご教示いただけると嬉しいです。
どうぞ宜しくお願いいたします。
my @buf = ("","","","","","","","","");
my @buf2 = ("","","","","","","","","");
my $set_flag = 1;
my $idx = 0;
while(){
if ($set_flag > 8){
last;
}
$idx = int(rand(8)) + 1;
if ($buf[$idx] ne ""){
}else{
$buf[$idx] = $set_flag;
$buf2[$set_flag] = $idx;
$set_flag++;
}
}
my $q_list = "";
for(my $loop=1;$loop<=8;$loop++){
if ($q_list ne ""){
$q_list .= ",";
}
$q_list .= "" .$buf2[$loop];
}
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;
ご回答有難うございます。
コメント付きで書いていただいたお陰で、大変良く分かり、こちらを参考にさせていただいて解決いたしました。
本当にありがとうございました。
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));
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 ) ;
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・【お題】絵本のタイトル
- ・【大喜利】世界最古のコンビニについて知ってる事を教えてください【投稿~10/10(木)】
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・ハマっている「お菓子」を教えて!
- ・最近、いつ泣きましたか?
- ・夏が終わったと感じる瞬間って、どんな時?
- ・10秒目をつむったら…
- ・人生のプチ美学を教えてください!!
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
週2回のペースって だいたい何...
-
月の第一週とは
-
エクセルで毎月第2週日の水曜日...
-
C言語での万年カレンダーのソー...
-
「曜日」の名前、変えるとしたら?
-
[Excel] ある日の曜日が当月の"...
-
よくある 『 第○(1・2・3・4・...
-
エクセルで、指定曜日を表示さ...
-
土曜日の26時って何曜日の何時...
-
指定曜日にMsgBox表示は可能で...
-
時計の曜日がいつのまにか違う
-
エクセルで相対パスの書き方を...
-
apacheでPerl CGIが作動せず、5...
-
同一ファイルでほかのページを作成
-
アンケートなどの1日1回の投...
-
fc2無料HPのディレクトリアクセ...
-
フォーム要素の文字数制限について
-
画像のアップロード機能
-
あれれ、クッキーが機能しませ...
-
プロキシサーバ経由を拒否したい
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
月の第一週とは
-
週2回のペースって だいたい何...
-
毎○曜日って、使いますか?
-
エクセルで毎月第2週日の水曜日...
-
よくある 『 第○(1・2・3・4・...
-
土曜日の26時って何曜日の何時...
-
[Excel] ある日の曜日が当月の"...
-
VBA。複数のChangeイベントをま...
-
今週とは何曜日から何曜日まで...
-
毎週同じ曜日にラブホに行くと...
-
曜日と曜の使い分けがわかりま...
-
ユーザー定義の(aaa)
-
今月は1日が日曜日で、31まであ...
-
指定曜日にMsgBox表示は可能で...
-
曜日のなぞ
-
Excelで第一〇曜日を求める方法...
-
日本語問題 昨日は何曜日ですか...
-
曜日派?日付派??
-
c言語の質問です。 ある月のカ...
-
6月の第2 第4火曜日は何日...
おすすめ情報