投稿者:ヘイホーの叫び
投稿日:2024/9/1
ジャンル:
技術・機構、
アルゴリズム
環境:通常
情報番号:21
説明
複数の要素をランダムに抽選する機構を制作する際、要素ごとに抽選確率を変更したいことがあります。
そのような時、「おもり」という考え方を使うと楽に実装できます。
小難しいことを言っていますが、要は分数です。
使用するのは /scoreboard です。
抽選結果を判定する際には /execute やセレクター引数 scores を使用するかと思われます。
①各要素の抽選確率を決定する
それぞれの要素がどれだけの確率で抽選されるのか決定します
総和が 1 (100%) になるよう注意しましょう。
また、確率は分数で、さらに分母を統一しておくと後から計算しやすいです。
②決定した確率を簡単な比に変換する
①で確率を分数で表しており、かつ適切な分母で統一した場合、各確率に分母の値を乗算したものが簡単な比になります。
③比の値の総和を求める
①で確率を分数で表しており、かつ適切な分母で統一した場合、その分母が総和になります。
④簡単な比をスコアの個数として順番に割り振る
ここまでの整理も兼ねて、ここでは例を用いて説明します。
要素が a, b, c の3つあり、それぞれの確率が 1/6, 2/6, 3/6 であると仮定します。
(1/6 + 2/6 + 3/6 = 1
この時、両辺に6を乗算すると
1 + 2 + 3 = 6
より、簡単な比は 1 : 2 : 3 となり、比の値の総和は 6 となります。)
このような場合、a には 1 つ、b には 2 つ、c には 3 つのスコアを割り振れば良いので、
a : 1
b : 2..3
c : 4..6
という割り振りになります、
割り振られた範囲に生成された乱数が該当する場合、抽選されたことになります。(⑤参照)
⑤乱数を生成する
/scoreboard を用いて、最小値を 1 、最大値を比の値の総和とする乱数を生成しましょう。
例を参照すると、1..6 の範囲で乱数を生成することになります。
この時、割り振られたスコアのどれかが抽選されることになります。
各要素の抽選確率が事前に決めた確率になることが確認できます。
⑥抽選結果をコマンドに反映する
/execute やセレクター引数 scores を用いて、抽選結果を基にコマンドを実行します。
最終更新:2024年12月26日 17:10