特定の組み合わせを回避した乱数の発生

3 views (last 30 days)
Sho Hata
Sho Hata on 1 Aug 2022
Commented: Sho Hata on 2 Aug 2022
乱数の発生時、特定の組み合わせを回避して乱数を発生させたいです。
具体的には、1~5の並び替えで乱数を発生させる際、[1 2 3 4 5]の組み合わせが発生した場合はその対極の組み合わせである[ 5 4 3 2 1]の組み合わせが乱数ないに発生しないようにしたい、もしくは発生した場合は検知して削除したいです。
1〜5の乱数をn通り発生させるコードは以下のような想定をしています。
n = 100
Order = cell(n,1);
rng('shuffle')
for r = 1:n
Order{r} = randperm(5);
end
発生した乱数を毎回Order(Cell配列)に格納する想定です。
この場合どのようにすれば上述のような対極の組み合わせの発生の回避又は発生した場合検知して削除できるでしょうか?
ご回答よろしくお願いします。

Accepted Answer

Atsushi Ueno
Atsushi Ueno on 1 Aug 2022
下記の重複が無い順列がn個あれば良いという事ですね。
  • 同一の並び順
  • 対極の並び順
> どのようにすれば上述のような対極の組み合わせの発生の回避又は発生した場合検知して削除できるでしょうか?
⇒「生成した乱数並び順と同一/対極の並び順がリストに無ければ追加する」様にすれば同じ事になります
n = 60; m = 5;
if n > factorial(m) / 2;
error('エラー:1~%dの乱数並び順は%d個以内', m, factorial(m) / 2)
end
OrderMat = zeros(n,m);
rng('shuffle');
r = 1;
while r <= n % n個揃うまでずっと続ける
rnd = randperm(m);
if ~ismember([rnd; fliplr(rnd)], OrderMat, 'rows')
OrderMat(r,:) = rnd; % リストに同一・対極の並び順が無ければ追加する
r = r + 1; % 追加したら個数を+1する
end
end
OrderCell = num2cell(OrderMat,2)
OrderCell = 60×1 cell array
{[5 4 1 2 3]} {[1 5 4 3 2]} {[1 5 2 4 3]} {[5 2 3 1 4]} {[2 1 5 4 3]} {[4 5 1 2 3]} {[3 2 4 5 1]} {[3 2 4 1 5]} {[5 1 2 3 4]} {[1 5 2 3 4]} {[4 1 5 2 3]} {[5 3 1 2 4]} {[3 2 5 4 1]} {[3 5 1 2 4]} {[5 2 1 4 3]} {[5 1 4 3 2]}
  • 乱数並び順がリストに存在するかどうかはismember関数で判断しています
  • ismember関数の都合でリストは行列とし、最後にセル配列に変換しました
  • 組み合わせ数はm!/2です。これを超えるとプログラムが終わらなくなるので最初にガードを掛けてます
  • mの数が大きくかつだと、(ほぼ)全ての並び順の組み合わせを乱数で当てるまでに時間が掛かります
  1 Comment
Sho Hata
Sho Hata on 2 Aug 2022
早速にご回答ありがとうございます。
いただいたコードで無事に欲しかった乱数のデータが生成できそうです。ありがとうございました!

Sign in to comment.

More Answers (0)

Categories

Find more on 乱数発生器 in Help Center and File Exchange

Products


Release

R2020a

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!