MS Access Tips/Sample and VBA and Blog customize etc...

重複しないランダムな数を全レコードに付与する

数千件ある全レコードに対して、一定範囲の数値でかつ重複しない乱数を付与するには、どのようにVBAで記述すれば良いのでしょうか?

某!知恵袋での質問の回答用にサンプルを作成しましたので、アップしておきます。

蛇足ですが、重複しないという条件が付くと正確には乱数とは言えません。

難易度:

仕様

テーブル名 Tbl1
重複しない乱数のフィールド名 UniqueRandomNum、
一定範囲の数値 は 0 から 9999 まで、
レコード件数は 10000件以下

回答用に作成した関数

考え方

配列をランダムに並べ替える関数 で紹介した関数の応用です。

  1. 一定範囲の数値を格納するための配列を用意して、連番を代入
  2. テーブルをレコードセットとして開き、最後のレコードに移動して、レコード件数を取得
  3. 0から範囲内の件数(配列の要素数 UB)まで範囲の乱数 P を取得する
  4. 取得した乱数 P の位置(インデックス)の配列の値 Nums(P) をカレントレコードのフィールドに代入して更新
  5. 一つ前へレコード移動する
  6. Nums(P) の値は使用済みなので不要、未使用の Nums(i)の値をNums(P)に待避
  7. 3. に戻り、1からUBまでの範囲の乱数を取得、以下下限値を一つずつ増やしながら、3.~6. をレコード件数-1 まで繰り返す
  8. レコードセットを閉じる

追記:2012/03/03 文章だけでは理解しづらいと思いますので、実際の動作例を図示して説明してみました。
「重複しないランダムな数を全レコードに付与する」動作原理(PDF)

汎用関数

使用例

サンプルMDB が下記からダウンロードできます。
VbaUniqueRandomNum_07.zip (Access 2007 形式 - 34kb)
VbaUniqueRandomNum.zip (Access 2002-2003 形式 - 20kb)
VbaUniqueRandomNum_2k.zip (Access 2000 形式 - 20kb)

拍手する

5 Comments

Saru says..."参考にさせていただいています"

いつも参考にさせていただいています。

汎用関数を使わせていただいているのですが、
中身をきちんと理解できていません。

なぜ重複せずに番号をふれるのでしょうか?

>6.Nums(P) の値は使用済みなので不要、未使用の Nums(i)の値をNums(P)に待避

上記あたりが重複しないための処理だと思うのですが、
よく理解できておりません。

大変お手数ですが、詳しい解説をしていただけないでしょうか?
宜しく御願いいたします。

2012.03.02 20:57 | URL | #- [edit]
hatena says..."re:参考にさせていただいています"

> なぜ重複せずに番号をふれるのでしょうか?

文章だけでは説明しづらいので、PDFを作成しました。

ブログの記事中のリンクを置きましたので、参照ください。

2012.03.03 02:02 | URL | #5uE6dEgY [edit]
Saru says..."ありがとうございます。"

資料まで作っていただきありがとうございます。
おかげで少しずつですが理解できました。

これから熟読させていただきます。

本当にありがとうございました。

2012.03.05 14:19 | URL | #- [edit]
Saru says..."再質問です"

少し確認させてください。

2ページ目の
i=2のループのところですが、
「Nums(4)の値9をカレントレコードに代入」とありますが、
これは「値0」ではないのでしょうか?

また、
3ページの「i=4」以降のNums(8)の値は「3」、Nums(1)の値は「1」ではないのでしょうか?

よく理解できていないこともあり、
お手数おかけいたしますが、
ご回答いただければ幸いです。

よろしくお願いいたします

2012.03.05 14:41 | URL | #- [edit]
hatena says..."re:再質問です"

> 2ページ目の
> i=2のループのところですが、
> 「Nums(4)の値9をカレントレコードに代入」とありますが、
> これは「値0」ではないのでしょうか?
>
> また、
> 3ページの「i=4」以降のNums(8)の値は「3」、Nums(1)の値は「1」ではないのでしょうか?

そうですね。編集ミスです。修正したものに差し替えます。

ご指摘ありがとうございました。

2012.03.05 14:52 | URL | #5uE6dEgY [edit]

Leave a reply






Trackbacks

trackback URL
http://hatenachips.blog34.fc2.com/tb.php/210-aeb62baf
該当の記事は見つかりませんでした。