アプリ版:「スタンプのみでお礼する」機能のリリースについて

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];
}

A 回答 (3件)

(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 ) ;
    • good
    • 0
この回答へのお礼

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

お礼日時:2013/04/19 16:44

先越されちゃいましたけど、書いちゃったので投げておきます。



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;
    • good
    • 0
この回答へのお礼

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

お礼日時:2013/04/19 16:46

脳のクールダウンに書いてみました。


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));
    • good
    • 0
この回答へのお礼

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

お礼日時:2013/04/19 16:47

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!