はじめに:サイコロの目を、自在に操れますか?
「1から20までのランダムな数字を出したい!」
Excelなら、RANDBETWEENやRANDARRAY関数を使えば一発です。
まるでサイコロを振るように、簡単に乱数を作れます。
でも、もしこんなリクエストがあったらどうしますか?
「1から20までの数字を出して。あ、でも『8』だけは絶対に出さないでね!」
「3の倍数以外の数字だけでランダムな表を作って!」
普通のサイコロでは、特定の目だけ出さないなんて不可能です。
しかし、Excelという名の「魔法のサイコロ」なら、それが可能です!
今回のテーマは、「ランダムな数値を作る(特定の値を除いて!)」。
初級編の「1つの数を除外」から、中級編の「条件付き除外」、そして上級編の「素数だけのシャッフル」まで。
数式だけで確率を自在に操る、知的な遊びにご招待します!
本記事では、無料のWeb版Excelを使用して検証および画像の作成を行っています。Windowsはもちろん、MacやLinuxの方もブラウザさえあれば挑戦できます!
ステップ1:まずは普通にランダム生成&可視化
まずは基本からです。
1から20までの整数を、ドーンと10,000個生成して、その「バラつき」を目で見てみましょう。
RANDARRAY関数の基本
最新のExcel(Web版やMicrosoft 365)では、RANDARRAY関数が最強です。
=RANDARRAY(10000,1,1,20,1)
この数式をA1セルに入力してみてください。
【引数の解説】
10000(行): 10,000行ぶん作ります。1(列): 1列ぶん作ります。1(最小値): スタートは1。20(最大値): ゴールは20。1(整数): ここがポイント!通常はTRUEと書きますが、Excelでは1もTRUEと同じ意味になります。入力が楽なので1を使っています。これで「整数」になります。
これで、A列にズラッと10,000個の数値が並びましたね!

バラつきを「データバー」で可視化する
「本当にランダムなの?」と疑り深いあなたへ。集計して可視化してみましょう。
1. C1セルに「カウント」と入力し、C2セルに =SEQUENCE(20) と入力して1~20の連番を作ります。
2. D1セルに「回数」と入力し、D2セルに以下の数式を入れます。=COUNTIF(A1:A10000,C2#)

C2#はスピル範囲参照です。C列の連番に対応する数が、A列に何個あるか数えます。
3. D列の数字が並んだら、「ホーム」タブ → 「条件付き書式」 → 「データバー」から好きな色を選んでみてください。

どうでしょう?だいたい同じくらいの長さのバーが並んでいますよね?
本来なら統計学的に「分散」などを計算して評価するところですが、今回は「Excelで暇つぶし」。
パッと見て「うん、だいたい均等だね!」と楽しめればOKです!
ステップ2:初級編「8」だけを除外せよ!
では本題です。1~20の中から、なぜか嫌われ者の「8」だけを除外してランダム生成してみましょう。
方法1:ズラして回避する (LET + IF)
=LET(a,RANDARRAY(10000,,1,19,1),IF(a>=8,a+1,a))
「1~20」から「8」を除くと、残りは19個の数字ですよね。
そこで、まず1~19の乱数を生成します。
・LET(a, RANDARRAY(..., 19, ...), ...): 1~19の乱数を作り、とりあえず「a」と名付けます。

・IF(a>=8, a+1, a): ここがミソ!「もし出た数字が8以上なら、+1してズラす」という操作をします。
するとどうなるでしょう?
- 1~7 はそのまま → 1~7
- 8 は +1 されて → 9
- 19 は +1 されて → 20
見事に「8」だけがスキップされ、1~20(8抜き)のランダム配列が完成します!頭いい!

方法2:確率を振り分ける (IF + RANDARRAY)
=IF(RANDARRAY(10000,,1,19,1)<8,RANDARRAY(10000,,1,7,1),RANDARRAY(10000,,9,20,1))
これは、少し力技に見えますが、確率を公平に保つための工夫がされています。
1. RANDARRAY(..., 1, 19, 1): まず1~19のサイコロを振ります。
2. ... < 8: もし出た目が8未満(つまり1~7の7通り)なら、RANDARRAY(..., 1, 7, 1)で1~7の乱数を出し直します。
3. それ以外(つまり8~19の12通り)なら、RANDARRAY(..., 9, 20, 1)で9~20の乱数を出し直します。
全体の19通りのうち、7/19の確率で小さい数、12/19の確率で大きい数が出るようになっているので、結果的にすべての数の出現確率は平等になります。

数式は長いですが、ロジックは明快ですね。
ステップ3:中級編「3の倍数」をすべて除外せよ!
「8」のような1つの数なら簡単でしたが、「3の倍数(3, 6, 9, 12, 15, 18)」のように複数の数を除外するにはどうすればいいでしょう?
ここで登場するのが、最強のコンビ「INDEX & FILTER」です!
=INDEX(FILTER(SEQUENCE(20),MOD(SEQUENCE(20),3)<>0),RANDARRAY(10000,,1,SUM(SIGN(MOD(SEQUENCE(20),3))),1))
この数式は、「リスト作り」と「くじ引き」の2段階で構成されています。
1. 有効な数字リストを作る (FILTER)
=FILTER(SEQUENCE(20),MOD(SEQUENCE(20),3)<>0)
・SEQUENCE(20): 1~20の連番を用意します。
・MOD(..., 3)<>0: 3で割った余りが0でない(3の倍数ではない)ものだけを残します。
これで、{1, 2, 4, 5, 7, 8, 10...} という「当たりくじのリスト」ができます。

2. くじ引きをする (INDEX & RANDARRAY)
このリストからランダムに選べばいいわけです。
・SUM(SIGN(MOD(SEQUENCE(20),3))): これは少し難しいですが、「当たりくじが何個あるか」を数えています。(今回は14個)

・RANDARRAY(..., 1, 14, 1): 1~14(くじの本数)の乱数を生成します。
・INDEX(リスト, 乱数): リストの「〇番目」にある数字を取り出します。
この方法は非常に汎用性が高く、どんな条件でも「リストさえ作れればシャッフルできる」という最強のテクニックです!

ステップ4:上級編 1~100の「素数」をシャッフルせよ!
最後は応用問題です。
「1から100までの素数」だけが出現するランダムな表を作ってみましょう。
まずは素数リストを作る
まずは、1から100までの数の中から素数だけを抜き出したリストを作ります。
ここでは2つの数式を紹介します。
1つの数式で素数の一覧を表示させる方法は他にもたくさんあります!
1. 古典的な行列計算アプローチ (MMULT)
Excel 2021以降で動く、職人芸のような数式です。
=FILTER(SEQUENCE(100),MMULT((MOD(SEQUENCE(100),SEQUENCE(,100))=0)*1,SEQUENCE(100)^0)=2)
解説:
・MOD(...)=0: 1~100の数を、1~100の数で総当たりで割り算し、割り切れるかを判定します。

・MMULT(...): 行列計算を使って、各数について「割り切れた回数(約数の個数)」を一気にカウントします。

・...=2: 約数がちょうど2個(1と自分自身)のものだけをFILTERで抽出します。これが「素数」です!

2. 最新関数アプローチ (MAP + LAMBDA)
最新のExcel(Microsoft 365など)を使っている方は、こちらの方が直感的かもしれません。
=FILTER(SEQUENCE(100),MAP(SEQUENCE(100),LAMBDA(a,SUM((MOD(a,SEQUENCE(a))=0)*1)=2)))
解説:
・MAP(..., LAMBDA(a, ...)): 1~100の各数値「a」に対して、個別に処理を行います。
・SUM((MOD(a,SEQUENCE(a))=0)*1): 各数値「a」について、1からaまでの数で割り算し、割り切れる回数(約数の数)を合計します。
・...=2: 約数が2個ならTRUEを返します。プログラミング的で読みやすいですね!

素数をシャッフルして配置する
では、作成した素数リストを使って、10行10列のマス目にランダムに配置してみましょう。
今回は古典的なMMULT版の数式を組み込んでみます。
=INDEX(FILTER(SEQUENCE(100),MMULT((MOD(SEQUENCE(100),SEQUENCE(,100))=0)*1,SEQUENCE(100)^0)=2),RANDARRAY(10,10,1,25,1))
1. FILTER(...): 先ほどの数式で、25個の素数リスト {2, 3, 5, ..., 97} を作ります。
2. RANDARRAY(10,10,1,25,1): 10行10列の範囲に、1~25(素数の個数)のランダムな整数をばら撒きます。
3. INDEX(素数リスト, 乱数): ばら撒かれた乱数を「インデックス番号」として使い、素数リストから対応する素数を引っ張ってきます。

これで、1~100の素数だけがランダムに現れる、美しい数学的な表の完成です!
まとめ:ランダムを作る鍵は「リスト」にあり
「特定の値を除外する」という一見難しそうな課題も、「出現させたい値のリスト(配列)を先に作り、そこからINDEXでくじ引きする」というロジックを使えば、どんな複雑な条件でもクリアできることが分かりました。
次回以降は、特定の値を出すだけでなく、「特定の値の出現率だけを上げる(レアキャラを出す!?)」方法なども投稿予定です!
お楽しみに!


