Excel ランダム数の出現率をコントロールする方法

Excel ランダム数の出現率をコントロールする方法 Excel

はじめに:そのサイコロ、仕込みを入れてみませんか?

「1から6までのサイコロを振る」。Excelなら =RANDARRAY 関数を使えば一発です。

でも、もしあなたがゲームの開発者で、こんなお願いをされたらどうしますか?

「『3』だけ、他の数字より2倍出やすくして!」
「レアキャラの出現率を下げて、コモンの出現率を上げて!」

普通のサイコロでは不可能ですが、Excelという名のデジタルサイコロなら、重心をいじって「特定の目だけ出やすくする」ことが可能です。

いわゆる「重み付け抽選(Weighted Random)」というやつですね。

今回のテーマは、「ランダム数の出現率をコントロールする方法」。

単純に「3」を増やして2倍にする方法から、「1.5倍」のような微妙な調整、さらにはすべての数字の出現率を自由自在に操る「確率の支配者」になる方法まで。

統計学の難しい話はナシ!

「くじ引き」や「的当て」のイメージで、直感的に確率を操る数式パズルを楽しみましょう!

本記事では、無料のWeb版Excelを使用して検証および画像の作成を行っています。Windowsはもちろん、MacやLinuxの方もブラウザさえあれば挑戦できます!

ステップ1:まずは普通のサイコロを10,000回振ってみる

比較のために、まずは細工なしの公平なランダム生成を行いましょう。

1. 10,000個の乱数を作成

任意のセル(例:A1)に以下の数式を入力します。

=RANDARRAY(10000,,1,6,1)

【関数の解説:RANDARRAY】

=RANDARRAY([行], [列], [最小], [最大], [整数])

  • : 10000。今回は1万行作ります。
  • : 省略(1列)
  • 最小: 1
  • 最大: 6
  • 整数: 1TRUEと同じ)。これで小数が含まれない整数になります。
Excelの説明画像

【データ量について】
今回はWeb版Excelでの動作を考慮して10,000行としています。もしローカル環境で高スペックなPCをお使いの方は、ぜひ100万行くらいで試してみてください。データが多いほど、確率はより正確に収束しますよ!

2. 出現回数を可視化する

C3セルに =SEQUENCE(6) と入力して1~6の連番を作ります。
D3セルに以下の数式を入力して、各数字が何回出たかカウントします。

=COUNTIF(A1#,C3#)

【関数の解説:COUNTIF】

=COUNTIF(範囲, 検索条件)

  • 範囲: A1#(A1に入れたスピル範囲全体)。
  • 検索条件: C3#(1~6の連番)。これで一気に全数字をカウントできます。
Excelの説明画像

さらに、D3:D8を選択して「条件付き書式」→「データバー」を設定してみましょう。

Excelの説明画像

どうでしょう?だいたい同じくらいの長さのバーが並んでいますよね?

Excelの説明画像

今回は統計的な「分散」などの難しい計算はしません。

パッと見でだいたい揃ってればOK!という、見た目重視のスタイルで進めます。


アプローチ1:[3]が出る確率を「2倍」にする(整数倍)

まずはシンプルに、「3」を他の数字の2倍出やすくしてみます。

イメージとしては、くじ引きの箱に「1, 2, 4, 5, 6」の紙は1枚ずつ、「3」の紙だけ2枚入れる感じです。

合計7枚のくじ引きですね。

数式その1:IF関数で書き換える

=LET(
a,RANDARRAY(10000,,1,7,1),
IF(a=7,3,a)
)

解説:
1. RANDARRAY(..., 1, 7, 1): まず、1から7までの乱数を作ります。
2.IF(a=7, 3, a): もし「7」が出たら、それを強制的に「3」に書き換えます。

結果として、「3」が出るのは元々の「3」の時と、「7」が出た時の2回分になります。これで確率は2倍です!

Excelの説明画像

数式その2:LOOKUPで割り当てる

=LOOKUP(RANDARRAY(10000,,1,7,1),SEQUENCE(7),{1;2;3;3;4;5;6})

【関数の解説:LOOKUP】

=LOOKUP(検索値, 検索範囲, 対応範囲)

1から7の乱数に対し、対応表を使って結果を割り当てます。

  • 1→1
  • 2→2
  • 3→3
  • 4→3 (ここで3がもう一回登場!)
  • 5→4
  • 6→5
  • 7→6

これでも同じく「3」が2回分になりますね。この方法は、複数の数字を増やしたい時に便利です。

Excelの説明画像

アプローチ2:[3]が出る確率を「1.5倍」にする(累積確率)

さて、ここからが本番です。

整数倍」ならくじを増やせばいいですが、「1.5倍」となると紙を半分に切るわけにはいきません。

ここで登場するのが「累積確率(Cumulative Probability)」という考え方です。

難しそう?大丈夫です。

ダーツの的(マト)」をイメージしてください。

・1, 2, 4, 5, 6 のエリアの広さは「1」
・3 のエリアの広さだけ「1.5」

この的を作って、ランダムにダーツを投げればいいのです!

1. 累積確率表を作って参照する

まずは、作業用の表を作ってみましょう。

合計の広さは 1+1+1.5+1+1+1 = 6.5 です。

確率の境界線
=0/6.5 (ここから1が始まる)
=1/6.5 (ここまでが1、ここから2が始まる)
=2/6.5 (ここまでが2、ここから3が始まる)
=3.5/6.5 (ここまでが3。幅が1.5ある!
=4.5/6.5 (ここまでが4、ここから5が始まる)
=5.5/6.5 (ここまでが5、ここから6が始まる)

Excelの説明画像

この数値がC4:C9にあるとして、以下の数式を使います。

=LOOKUP(RANDARRAY(10000),C4:C9,{1,2,3,4,5,6})

解説:
RANDARRAY(10000) は0以上1未満の小数を返します(ダーツを投げる位置)。
LOOKUP関数は、その矢が「どの区間(マト)」に刺さったかを判定してくれます。「3」の区間だけ広いので、当然「3」に当たりやすくなるわけです。

Excelの説明画像

【なぜLOOKUP関数なのか?】
「条件分岐ならIFS関数ではダメなの?」と思うかもしれません。IFS関数でやろうとすると、=IFS(数値<0.15, 1, 数値<0.30, 2, ...) のように、すべての境界値を手動で設定しなければならず、非常に大変です。
LOOKUP関数は、「昇順に並んだ配列」を渡すだけで、自動的に「どの区間に当てはまるか」を高速に判定してくれるため、今回のようなケースに最適なのです!

LOOKUP関数の詳しい使い方は、LOOKUP関数の使い方!IFより簡単な条件分岐で紹介しています!

2. 数式だけで一発で出す(MMULT版)

表を作るのが面倒?

ならば、数式の中で表を作ってしまいましょう!行列計算の出番です。

=LET(
n,10000,
w,{1,1,1.5,1,1,1},
L,(SEQUENCE(6)<SEQUENCE(,6))*1,
cum,MMULT(w,L)/SUM(w),
LOOKUP(RANDARRAY(n),cum,{1,2,3,4,5,6})
)

解説:
w: 重み(Weight)の設定です。3番目だけ「1.5」にしています。
cum: ここで「累積確率表(区間の開始位置)」を作っています。
 (SEQUENCE(6)>SEQUENCE(,6))*1 は、対角線より下が0、上が1になる行列を作ります。

Excelの説明画像

これを重み w と掛け合わせる(MMULT)ことで、{0, 1, 2, 3.5, 4.5, 5.5} のような「足し合わせた配列」が一瞬で完成します!

Excelの説明画像


・最後に合計 SUM(w) で割って、0~1の範囲に正規化しています。

Excelの説明画像

Excelの説明画像

3. 数式だけで一発で出す(最新SCAN版)

最新のExcelなら、SCAN関数を使うともっとスマートに書けます。

=LET(
n,10000,
w,{1;1;1.5;1;1;1},
cum,VSTACK(0,SCAN(0,w,LAMBDA(a,b,a+b)))/SUM(w),
LOOKUP(RANDARRAY(n),cum,{1,2,3,4,5,6})
)

解説:
SCAN(0,w,LAMBDA(a,b,a+b)): 重み w を上から順に足し算(累積)していきます。
VSTACK(0, ...): 先頭に「0」をくっつけます。これで「0から始まる区間リスト」の完成です。

やっていることはMMULT版と同じですが、より現代的で読みやすいですね。

Excelの説明画像

アプローチ3:確率の支配者になる(自由自在)

ここまで来れば、もうあなたは確率を自由に操れます。

「1」は1.5倍、「2」は普通、「3」は1.5倍、「5」は出にくく0.75倍…なんて設定も思いのままです。

数式と解説

=LET(
n,10000,
w,{1.5,1,1.5,1,0.75,0.5},
L,(SEQUENCE(6)>SEQUENCE(,6))*1,
cum,MMULT(w,L)/SUM(w),
LOOKUP(RANDARRAY(n),cum,{1,2,3,4,5,6})
)

解説:
変更したのは w(重み)の部分だけ!

{1.5, 1, 1.5, 1, 0.75, 0.5} と好きな比率を指定するだけで、その通りの出現率でランダムな数値が生成されます。

データバーを確認してみてください。

「3」は長く、「6」は短くなっていませんか?

Excelの説明画像

これが「意図的なランダム」の世界です。

まとめ:確率は、作れる!

ランダム」というと「運任せ」のイメージがありますが、裏側でロジックを組めば、運命はコントロールできるのです。

このテクニックは、ゲームのガチャ確率だけでなく、「当番表で特定の人の負担を減らす」とか「キャンペーンで特定の等級を当たりやすくする」といった、実務的な(ちょっとズルい?)場面でも応用できるかもしれません。

ぜひ、あなただけの「重み付け」を設定して、Excelのサイコロを転がしてみてくださいね!

タイトルとURLをコピーしました