Excel でランダムな数字を作ろうとして、たいてい二か所でつまずきます。
ひとつは 「重複しないようにできない」。もうひとつは 「開き直したら数字が変わっていた」。どちらも関数の仕様どおりの動きで、バグではありません。仕様を知っていれば回避できます。
このページでは三つの乱数関数の違いを整理して、重複なしを作る定番手順と、結果を固定する方法をまとめます。最後に、Excel でやるべき場面とそうでない場面の線引きも書きます。
三つの関数は役割が違う
| 関数 | 返すもの | 使える環境 |
|---|---|---|
RAND() |
0以上1未満の小数 | すべて |
RANDBETWEEN(下限, 上限) |
指定範囲の整数(両端を含む) | Excel 2007 以降 |
RANDARRAY(行, 列, 最小, 最大, 整数) |
範囲にまとめて展開 | Microsoft 365 / Excel 2021 以降 |
RAND() は一見使いにくそうに見えますが、並べ替えの材料として最も出番があります(後述)。
RANDBETWEEN(1,100) は 1 から 100 の整数を返します。100 も出ます。範囲の指定はこれがいちばん素直です。
RANDARRAY は新しい関数で、RANDARRAY(10,1,1,100,TRUE) のように書くと 10 行ぶんが一度に展開されます。使える環境なら手数が減ります。
そして 三つとも「重複を防ぐ機能」は持っていません。 ここが最初の落とし穴です。
値が勝手に変わるのは仕様です
RAND・RANDBETWEEN・RANDARRAY はすべて揮発性関数です。シートのどこかを編集する、行を挿入する、ファイルを開き直す、F9 を押す — それだけで再計算されて値が変わります。
抽選結果を保存したはずなのに翌日開いたら別の数字になっていた、というのはほぼこれが原因です。引いた瞬間に固定しない限り、その数字は残りません。
固定する方法は二つあります。
- 値として貼り付ける。 該当セルをコピーして、同じ場所に「形式を選択して貼り付け → 値」。関数が消えて数字だけが残ります。これがいちばん確実です。
- 計算方法を手動にする。 数式タブ → 計算方法の設定 → 手動。再計算を止められますが、ブックの設定なので他の数式にも効きます。一時しのぎ向きです。
抽選や当選者選びのようにあとから結果を示す必要がある作業では、必ず値として固定してください。
重複なしを作る定番手順
RANDBETWEEN を縦に並べても重複は防げません。100 人から 10 人選ぼうとして 10 個並べると、同じ番号が入ります。
そこで RAND() で乱数列を作り、その順で並べ替えるというやり方をします。番号そのものをランダムに作るのではなく、番号の並び順をランダムにするという発想です。
- A列に 1〜100 の連番を入れる
- B列に
=RAND()を入れて100行ぶん埋める - B列をコピーして値として貼り付ける(並べ替え中に再計算されると順序が壊れます)
- A〜B列を選択して、B列を基準に並べ替える
- A列の上から必要な数だけ取る
3 番を飛ばすと、並べ替えの途中で乱数が計算し直されて、意味のない結果になります。ここが実際にいちばん多い失敗です。
並べ替えたくない場合は RANK.EQ を使う手もあります。B列に =RAND()、C列に =RANK.EQ(B1,$B$1:$B$100) を入れると、C列に 1〜100 の重複しない順位が並びます。ただしこれも揮発性なので、固定は必要です。
Microsoft 365 なら一行で済みます
動的配列が使える環境なら、こう書けます。
=SORTBY(SEQUENCE(100), RANDARRAY(100))
SEQUENCE(100) が 1〜100 を作り、RANDARRAY(100) の乱数を基準に並べ替えます。これで重複のないシャッフルが一発で出ます。上位10件だけ欲しければ =TAKE(SORTBY(SEQUENCE(100),RANDARRAY(100)),10) です。
小数・範囲・刻みの指定
特定範囲の小数が欲しいときは =RAND()*(上限-下限)+下限 です。1〜5 の小数なら =RAND()*4+1。
0.5 刻みのような値なら、いったん整数で作って割ります。=RANDBETWEEN(2,10)/2 で 1.0〜5.0 が 0.5 刻みで出ます。
負の数も RANDBETWEEN(-50,50) のようにそのまま書けます。
なお、RANDBETWEEN に小数を渡すと切り上げ・切り捨てが起きて意図とずれます。小数が要るなら RAND() を使ってください。
番号ではなく「名前」を取り出したいとき
実務では番号ではなく名簿から人を選びたい、という形が多いはずです。
一人だけでよければ =INDEX(A:A, RANDBETWEEN(1,100)) で A 列の100人から一人が出ます。ただしこれを縦に10個並べると、同じ人が二度出ます。 抽選には使えません。
重複させたくないなら、さきほどの並べ替えの手順で作った「重複しない順位」を使います。C列に順位が入っているなら、=INDEX($A$1:$A$100, C1) で名前に戻せます。乱数で名前を直接引くのではなく、順番を作ってから名前を当てにいく、という順序です。
Microsoft 365 なら名簿ごとシャッフルできます。
=SORTBY(A1:A100, RANDARRAY(100))
当選者10名と補欠3名がまとめて欲しいなら、=TAKE(SORTBY(A1:A100,RANDARRAY(100)),13) で13名を出し、上から10名を当選、11〜13番目を補欠にします。抽選の段取りとしても、この形がいちばん説明しやすくなります(ランダム数字で抽選する に手順をまとめています)。
Excel でやるべき場面、そうでない場面
Excel が向いているのは、乱数がシートの中の他の計算とつながっているときです。テストデータを大量に作る、モンテカルロ的な試算を回す、数百行に散らして使う。こういう場合は関数のまま置いておく意味があります。
向いていないのは、一回きりの抽選です。 100 人から 10 人選ぶために、連番を振り、乱数列を作り、値貼り付けし、並べ替え、上から取る — この五工程を組んだ挙句、揮発性で壊れるリスクを抱えることになります。範囲と個数と重複なしを指定して一度引けば済む作業に対しては、手数が釣り合いません。
判断の目安はこうです。その乱数を、あとで別の計算に使いますか。 使うなら Excel。結果の数字だけが欲しいなら、ブラウザで引いて記録するほうが早く、壊れません。
よくある質問
Q. RANDBETWEEN が使えません。
Excel 2007 より前のバージョンでは分析ツールアドインが必要でした。現在のバージョンなら標準で使えます。名前を打ち間違えている(RANDOMBETWEEN など)ケースもよくあります。
Q. RANDARRAY が候補に出てきません。
Microsoft 365 か Excel 2021 以降でないと使えません。SEQUENCE・SORTBY・TAKE も同じ世代の関数なので、まとめて使えないはずです。その場合は RAND() で並べ替える手順のほうを使ってください。
Q. 並べ替えたら順序がめちゃくちゃになりました。 乱数列を値として固定せずに並べ替えると、並べ替えの過程で再計算が起きて順序が壊れます。B列を値貼り付けしてから並べ替えてください。
Q. 同じ乱数をもう一度出せますか。 Excel の乱数関数にシード(種)を指定する機能はありません。再現したいなら、出した値を保存しておく以外にありません。
Q. 重み付き抽選(当選確率を変える)はできますか。 連番のほうを工夫します。当選しやすくしたい人に番号を複数割り当てておけば、その人の確率がそのぶん上がります。乱数の側ではなく名簿の側で調整する、と考えると簡単です。
Q. Google スプレッドシートでも同じですか。
RAND・RANDBETWEEN はほぼ同じ挙動です。RANDARRAY も使えます。ただし再計算のタイミング設定(ファイル → 設定 → 計算)は Excel と別なので、固定したいときは値として貼り付けるのが確実です。