エクセル関数で重複しない桁数の多い乱数の生成方法(範囲指定可能)【コピペ用テンプレートあり】

はじめに
エクセル関数のみで、桁数の多い乱数を重複なしで生成する方法 を紹介します。
下にテンプレート(セルデータサンプル)があるので、
生成できる値
生成したい値の
- 最小値
- 最大値
- 桁数
を指定できます。
たとえば、下記のテンプレートでは、
※ ただし、生成され得る値の数(1~9が範囲の場合は9個)が少ない場合は、重複する可能性があります。
エクセルでの算出方法
以下の 全セルをコピー
ボタンをクリックし、エクセルの A1
セルに貼り付けると、 L
列に乱数が出力されます。
出力する乱数の個数を増やす場合は、 E
~ M
列の行数をコピー(オートフィル)で増やしてください。
生成する乱数の範囲や小数部桁数を変更したい場合は、 C2
~ C4
セルの値を変更してください。 C11
セルの表示で確認できます。
算出手順
乱数の生成工程は、少し多いですが、大まかには以下を行っています。
- 取り得る数値を、出力数の分だけ分割し区間を作成
- 区間をずらしながら、区間内で乱数を生成(重複が1回ずつ発生する可能性込み)
- 重複を解消
- 並び替え用の乱数を生成し、並び替え
1. 取り得る数値を、出力数の分だけ分割し区間を作成
乱数の重複がないように、
- i.
C7
セル : 計算欄2の行数から、 出力数 を算出します。 - ii.
C8
セル : 設定値(最小値、最大値、小数部桁数)を使って、 取り得る数値の個数 を算出します。- 例)最小値:1000.0、最大値:9999.9、小数部桁数:1の場合、90000個の数値が取り得る
- iii.
C9
セル : iとiiから、 個数/区間 (1区間あたりの数値の個数)を算出します。
2. 区間をずらしながら、区間内で乱数を生成
分割した区間を使い、乱数を生成します。
ここで生成される乱数は整数(0 ~ 取り得る数値の個数)です。
- i.
F
列 : 手順1の 個数/区間 の値を前の行に足しながら 乱数最小値 を設定します。 - ii.
G
列 : 乱数最小値 + 2× 個数/区間 - 1 を 乱数最大値 に設定します。- 区間が他の区間と1回だけ重複するように "2×" を行い、重複解消のため "-1" を入れています。
- iii.
H
列 :RANDBETWEEN()
関数を使い、乱数最小値 ~ 乱数最大値の範囲で乱数を生成します。- 取り得る数値の個数 を超える値は折り返して0スタートするように、
MOD()
関数を入れています。
- 取り得る数値の個数 を超える値は折り返して0スタートするように、
最小値
, 最大値
)指定した最小値
と最大値
の範囲内で、
整数の乱数(重複あり)を1つ生成する。
乱数の分布は一様分布。
最小値
最大値
数値
, 除数
)数値
を除数
で割った 余り(剰余)を返す
(数値
が除数
を超えると、0スタートで折り返された値が得られる)。
数値
除数
3. 重複を解消
手順2で発生した重複を解消します(I
列)。
COUNTIF()
関数を使い、重複を検出し、1を加えます
手順2と同様に、MOD()
関数を使い、 取り得る数値の個数 を超える値は折り返して0スタートするようにしています。
配列
, 検索条件
)指定した 配列
データ中で、 検索条件
に合致する個数をカウント する。
配列
検索条件
設定値によっては重複が発生する可能性あり
取り得る数値の個数 が少ない設定の場合、多数の重複が生じ、
ここでの処理によって解消しきれない場合があります。重複が残っている場合は
C11
セルに有
と表示されます。
4. 並び替え用の乱数を生成し、並び替え
手順3までの乱数は、昇順に並んでいるので、ランダムに並び替えます。
- i.
J
列 :RAND()
関数で各行ごとに乱数を生成します。 - ii.
K
列 : iの値とRANK.EQ()
関数で並び 順序 番号を作成します。 - iii.
L
列 :MATCH()
,INDEX()
関数を使い、 順序 番号と No.を照合させ、手順3の乱数を並び替えます。 - iv.
L
列 : 設定欄の最小値、最大値、小数部桁数に合うようにスケーリング、桁数を修正します(ROUNDDOWN()
関数使用)。
0以上1未満の乱数を返す。
数値
, 参照
, 順序
)参照
範囲の中で、数値
が何番目に大きいのか(or 小さいのか)ランクを表示する。
同じ数値の場合は、最上位ランクが返される
(例:3位と4位の値が同じ → 2つの3位を返す)。
数値
参照
順序
0
: 降順、0
以外:昇順。(省略時 0
)検査値
, 検査範囲
, 照合の種類
)指定した検査範囲
の中を検索し、最初に検査値
に マッチしたセルの相対位置を返す。
検査値
検査範囲
照合の種類
0
:完全一致でマッチ、1
:検査値
以下の最大値にマッチ、-1
:検査値
以上の最小値にマッチ)。配列
, 行番号
, 列番号
)配列
範囲の中で、行番号
の位置の値を返す
(配列
が2次元の場合、行番号
列番号
の位置の値を返す)。
配列
行番号
配列
から抽出する要素の行番号。列番号
配列
から抽出する要素の列番号。