2025/5/3

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

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

はじめに

エクセル関数のみで、桁数の多い乱数を重複なしで生成する方法 を紹介します。 4桁以上でも可能です。 バージョン2021、365より前のバージョンでも動作します。

下にテンプレート(セルデータサンプル)があるので、 コピペですぐに使用できます。

生成できる値

生成したい値の

  • 最小値
  • 最大値
  • 桁数

を指定できます。 行を増やすことで生成する乱数の個数を増やせます。

たとえば、下記のテンプレートでは、 1000.0 ~ 9999.9の範囲(桁数5、小数部桁数1)で、 10個の乱数を重複なしで ※ 取得できます。

※ ただし、生成され得る値の数(1~9が範囲の場合は9個)が少ない場合は、重複する可能性があります。

エクセルでの算出方法

以下の 全セルをコピー ボタンをクリックし、エクセルの A1 セルに貼り付けると、 L列に乱数が出力されます。

出力する乱数の個数を増やす場合は、 E ~ M列の行数をコピー(オートフィル)で増やしてください。

生成する乱数の範囲や小数部桁数を変更したい場合は、 C2 ~ C4セルの値を変更してください。 パラメータによっては、乱数に重複が発生する可能性があります。 重複の有無は、C11セルの表示で確認できます。

ABCDEFGHIJKLM
1設定欄計算欄2結果確認欄
2最小値1000No.区間最小値区間最大値乱数(値)重複補正乱数(順序)順序出力値データ数
3最大値9999.90017999912791270.59645081.91
4小数部桁数1190002699912826128260.35168051.71
52180003599931377313770.9101912.61
6計算欄13270004499939945399450.71934994.41
7出力数104360005399940820408200.83212282.51
8取り得る数値の個数900005450006299956791567910.408566791
9個数/区間90006540007199970518705180.34978057.21
107630008099970573705730.34688510.51
11重複の有無8720008999975106751060.72724137.61
129810009899984888848880.10799488.71

算出手順

乱数の生成工程は、少し多いですが、大まかには以下を行っています。

  1. 取り得る数値を、出力数の分だけ分割し区間を作成
  2. 区間をずらしながら、区間内で乱数を生成(重複が1回ずつ発生する可能性込み)
  3. 重複を解消
  4. 並び替え用の乱数を生成し、並び替え

1. 取り得る数値を、出力数の分だけ分割し区間を作成

乱数の重複がないように、 出力される可能性のある全ての数値の個数を算出し、 出力する数値分の区間に分割します。 ここで、1区間あたりの数値の個数を計算します。

  • i. C7セル : 計算欄2の行数から、 出力数 を算出します。
  • ii. C8セル : 設定値(最小値、最大値、小数部桁数)を使って、 取り得る数値の個数 を算出します。
    • 例)最小値:1000.0、最大値:9999.9、小数部桁数:1の場合、90000個の数値が取り得る
  • iii. C9セル : iとiiから、 個数/区間 (1区間あたりの数値の個数)を算出します。

2. 区間をずらしながら、区間内で乱数を生成

分割した区間を使い、乱数を生成します。 このとき、他の乱数の区間と一部重なるようにしているため、 1回重複する可能性を含めています (可能な限り一様分布を維持しながら、ランダム性も確保するため)。

ここで生成される乱数は整数(0 ~ 取り得る数値の個数)です。 以下の手順で生成します。

  • i. F列 : 手順1の 個数/区間 の値を前の行に足しながら 乱数最小値 を設定します。
  • ii. G列 : 乱数最小値 + 2× 個数/区間 - 1 を 乱数最大値 に設定します。
    • 区間が他の区間と1回だけ重複するように "2×" を行い、重複解消のため "-1" を入れています。
  • iii. H列 : RANDBETWEEN()関数を使い、乱数最小値 ~ 乱数最大値の範囲で乱数を生成します。
    • 取り得る数値の個数 を超える値は折り返して0スタートするように、MOD()関数を入れています。
fxRANDBETWEEN関数
RANDBETWEEN ( 最小値, 最大値)

指定した最小値最大値の範囲内で、 整数の乱数(重複あり)を1つ生成する。 乱数の分布は一様分布。

最小値
: 必須
1
最小値(数値)。
最大値
: 必須
2
最大値(数値)。
fxMOD関数
MOD ( 数値, 除数)

数値除数で割った 余り(剰余)を返す数値除数を超えると、0スタートで折り返された値が得られる)。

数値
: 必須
10
除算の分子の数値。
除数
: 必須
3
除算の分母の数値。

3. 重複を解消

手順2で発生した重複を解消します(I列)。

COUNTIF()関数を使い、重複を検出し、1を加えます (手順2iiで "-1"を入れ、乱数の範囲を狭めているのは、 ここで1を加えたことによる重複発生を回避するため)。

手順2と同様に、MOD()関数を使い、 取り得る数値の個数 を超える値は折り返して0スタートするようにしています。

fxCOUNTIF関数
COUNTIF ( 配列, 検索条件)

指定した 配列 データ中で、 検索条件 に合致する個数をカウント する。

配列
: 必須
A1:A5
検索するデータ範囲。
検索条件
: 必須
">=" & E2
カウントする条件。

設定値によっては重複が発生する可能性あり

取り得る数値の個数 が少ない設定の場合、多数の重複が生じ、
ここでの処理によって解消しきれない場合があります。

重複が残っている場合は C11セルに と表示されます。

4. 並び替え用の乱数を生成し、並び替え

手順3までの乱数は、昇順に並んでいるので、ランダムに並び替えます。

  • i. J列 : RAND()関数で各行ごとに乱数を生成します。
  • ii. K列 : iの値とRANK.EQ()関数で並び 順序 番号を作成します。
  • iii. L列 : MATCH(), INDEX()関数を使い、 順序 番号と No.を照合させ、手順3の乱数を並び替えます。
  • iv. L列 : 設定欄の最小値、最大値、小数部桁数に合うようにスケーリング、桁数を修正します(ROUNDDOWN()関数使用)。
fxRAND関数
RAND ( )

0以上1未満の乱数を返す。

fxRANK.EQ関数
RANK.EQ ( 数値, 参照, 順序)

参照範囲の中で、数値が何番目に大きいのか(or 小さいのか)ランクを表示する。 同じ数値の場合は、最上位ランクが返される (例:3位と4位の値が同じ → 2つの3位を返す)。

数値
: 必須
A2
評価する数値。
参照
: 必須
A$2:A$6
ランク付けする範囲。
順序
: 任意
1
ランク付け方向を設定する数値。0 : 降順、0以外:昇順。(省略時 0
fxMATCH関数
MATCH ( 検査値, 検査範囲, 照合の種類)

指定した検査範囲の中を検索し、最初に検査値マッチしたセルの相対位置を返す。

検査値
: 必須
"C"
検索する値(文字列や数値)。
検査範囲
: 必須
A1:A5
検索範囲。
照合の種類
: 任意
0
照合の型を設定する数値0:完全一致でマッチ、1検査値以下の最大値にマッチ、-1検査値以上の最小値にマッチ)。
fxINDEX関数
INDEX ( 配列, 行番号, 列番号)

配列範囲の中で、行番号の位置の値を返す
配列が2次元の場合、行番号 列番号の位置の値を返す)。

配列
: 必須
A1:B5
値を抽出する範囲。
行番号
: 必須
3
配列から抽出する要素の行番号。
列番号
: 任意
2
配列から抽出する要素の列番号。