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.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 ) ;
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));
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 別シートから年齢別の件数をカウントしたいの続き 5 2023/01/24 00:16
- Visual Basic(VBA) マクロVBA 1シートをまとめる 閉じ方 初心者 SOS! 1 2022/06/17 14:54
- Visual Basic(VBA) オブジェクトが見つかりません 1 2023/06/24 19:43
- Visual Basic(VBA) ExcelVBAでDo Until loopのネスト、IF文を使って一致する物と一致しない物としたい 11 2022/12/24 17:46
- Excel(エクセル) 製品番号での整列と、検索に関して 3 2023/06/28 19:20
- PHP PHPでCSVを出力するさいに、ループの中で前の行の値を変更したい 3 2022/10/27 17:44
- Visual Basic(VBA) 別シートから年齢別の件数をカウントしたい 6 2023/01/23 12:00
- Visual Basic(VBA) フォルダの場所を可変にしたいです(マクロ) 4 2023/05/11 10:00
- Visual Basic(VBA) ワークブック内すべて検索 2 2022/12/20 20:13
- その他(Microsoft Office) マクロVBAについて 1 2022/09/06 18:12
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
よくある 『 第○(1・2・3・4・...
-
月の第一週とは
-
毎○曜日って、使いますか?
-
エクセルで毎月第2週日の水曜日...
-
6月の第2 第4火曜日は何日...
-
週2回のペースって だいたい何...
-
毎週同じ曜日にラブホに行くと...
-
燃えるゴミの日は何曜日ですか?
-
Excel VBA 第〇△曜日の場合休日...
-
ユーザー定義の(aaa)
-
指定曜日にMsgBox表示は可能で...
-
C# 毎月1日の曜日について
-
入力した日は何曜日か
-
指定した日付から曜日を求める。
-
C言語での万年カレンダーのソー...
-
土曜日の26時って何曜日の何時...
-
先日、『カシオ エディフィス ...
-
平日朝の国道246線混雑状況につ...
-
曜日を求めるプログラムはどう...
-
for a week tomorrowはどういう...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
月の第一週とは
-
よくある 『 第○(1・2・3・4・...
-
エクセルで毎月第2週日の水曜日...
-
毎○曜日って、使いますか?
-
燃えるゴミの日は何曜日ですか?
-
週2回のペースって だいたい何...
-
土曜日の26時って何曜日の何時...
-
[Excel] ある日の曜日が当月の"...
-
6月の第2 第4火曜日は何日...
-
週休3日制で土日の他にもう一日...
-
VBA。複数のChangeイベントをま...
-
Excelで第一〇曜日を求める方法...
-
ユーザー定義の(aaa)
-
c言語の質問です。 ある月のカ...
-
一年の第何週目であるかを判断...
-
今週とは何曜日から何曜日まで...
-
日本語問題 昨日は何曜日ですか...
-
指定曜日にMsgBox表示は可能で...
-
Consolidateメソッドの引数のSo...
-
Excel VBA 第〇△曜日の場合休日...
おすすめ情報