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

3 ビュー (過去 30 日間)
Sho Hata
Sho Hata 2022 年 8 月 1 日
コメント済み: Sho Hata 2022 年 8 月 2 日
乱数の発生時、特定の組み合わせを回避して乱数を発生させたいです。
具体的には、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配列)に格納する想定です。
この場合どのようにすれば上述のような対極の組み合わせの発生の回避又は発生した場合検知して削除できるでしょうか?
ご回答よろしくお願いします。

採用された回答

Atsushi Ueno
Atsushi Ueno 2022 年 8 月 1 日
下記の重複が無い順列が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 件のコメント
Sho Hata
Sho Hata 2022 年 8 月 2 日
早速にご回答ありがとうございます。
いただいたコードで無事に欲しかった乱数のデータが生成できそうです。ありがとうございました!

サインインしてコメントする。

その他の回答 (0 件)

カテゴリ

Help Center および File Exchange乱数発生器 についてさらに検索

製品


リリース

R2020a

Community Treasure Hunt

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

Start Hunting!