はじめに:そのサイコロ、仕込みを入れてみませんか?
「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 - 整数:
1(TRUEと同じ)。これで小数が含まれない整数になります。

【データ量について】
今回はWeb版Excelでの動作を考慮して10,000行としています。もしローカル環境で高スペックなPCをお使いの方は、ぜひ100万行くらいで試してみてください。データが多いほど、確率はより正確に収束しますよ!
2. 出現回数を可視化する
C3セルに =SEQUENCE(6) と入力して1~6の連番を作ります。
D3セルに以下の数式を入力して、各数字が何回出たかカウントします。
=COUNTIF(A1#,C3#)
【関数の解説:COUNTIF】
=COUNTIF(範囲, 検索条件)
- 範囲:
A1#(A1に入れたスピル範囲全体)。 - 検索条件:
C3#(1~6の連番)。これで一気に全数字をカウントできます。

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

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

今回は統計的な「分散」などの難しい計算はしません。
「パッと見でだいたい揃ってれば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倍です!

数式その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回分になりますね。この方法は、複数の数字を増やしたい時に便利です。

アプローチ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が始まる)

この数値がC4:C9にあるとして、以下の数式を使います。
=LOOKUP(RANDARRAY(10000),C4:C9,{1,2,3,4,5,6})
解説:RANDARRAY(10000) は0以上1未満の小数を返します(ダーツを投げる位置)。
LOOKUP関数は、その矢が「どの区間(マト)」に刺さったかを判定してくれます。「3」の区間だけ広いので、当然「3」に当たりやすくなるわけです。

【なぜ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になる行列を作ります。

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

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


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版と同じですが、より現代的で読みやすいですね。

アプローチ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のサイコロを転がしてみてくださいね!


