背景
何かと叩かれることの多いRAND関数ではあるが,
https://support.microsoft.com/ja-jp/kb/828795 を信じるならば,10の13乗以上の周期をもつということになろう。ただし,この実装が誤っているという指摘もある。
当方の興味としては,周期そのものよりも,最小,最大がどうなるかに興味があったので,実験的に検証した。
検証環境
Excel 2013(64bit) + Windows 10 Pro(64bit)
CPU: Core i7 2.4GHz
RAM: 16GB
仮想メモリ: OFF
検証方法
以下の手順で検証した。
ただし,種数がどのように取得されているのか不明なので,この手順で独立な乱数が発生できているのかどうかも不明である。
- 1048576行×125列(=約1.3億個)のRAND関数を入力する。
- セルを再計算させ,1.の乱数列の最小,最大を求める。
- 2を5000回繰り返し(=計 約6500億個の乱数),それらの最小,最大を求める。
結果
最小: 1.21080923065620E-12(1160回目の再計算のとき)
最大: 9.99999999999094E-01(680回目の再計算のとき)
なお,計 約6500億個の乱数のなかで,上記最小値・最大値が再度出現することはなかった。
計算時間は約42時間かかった。
RAM 16GBを実装し,仮想メモリOFFのコンピュータで,
OS起動直後にExcelだけ起動した状態で,RAMが1.9GB消費されている。
この状態で新規ブックを開き,
- 列Aの1048576個のセルに RAND関数を入力する。
- 列全体の結果を値として固定する。
- これをDo~Loopで繰り返して,何列まで入力できるか?
を試した。
その結果,411列まで実行して,RAMが約8GB消費されていた。この時点で約2時間経過したので,マクロの実行を中止し,保存したところ,ファイル容量は約4.4GBであった。
作成したファイルをいったん閉じて,再度開いて操作可能状態になるのに,2分50秒。
列A全体を選択し,コピーしようとしたところで,Excelが動作停止してしまった。
OSを再起動して,再度試みるも,やはり列全体をコピーしようとしたところで,動作停止した。
RAMの空きは約7GBあるにもかかわらず・・・。
100万個×400列のデータを格納できることは確認できたが,それ以上は実用にならないのだろう。
確認環境
Excel 2013(64bit) + Windows 10 Pro(64bit)
RAM 16GBを実装し,仮想メモリOFFのコンピュータで,
OS起動直後にExcelだけ起動した状態で,RAMが1.9GB消費されている。
この状態で新規ブックを開き,
- 列Aの1048576個のセルに RAND関数を入力する。
- 列Bの1048576個のセルににRAND関数を入力する。
- これをDo~Loopで繰り返して,何列まで入力できるか?
を試した。
その結果,172列か173列のあたりで,RAMが上限まで消費され,動作不安定となった。
仮想メモリをON(システム管理サイズ)にしてみると,184列までは入力できたが,それ以上は時間がかかりそう(一見,無反応だが,処理はやっている模様)なので中止した。本件に関して,仮想メモリをONにすることの実用上のありがたみはほとんどないということであろう。
なお,仮想メモリをOFFに戻して再度実験し,170列まで入力した状態で,
- ファイル容量は約2.7GB(xlsb形式)
- 作成したファイルをいったん閉じて,再度開いて操作可能状態になるのに,5分20秒
- 約1億7800万個のセルの平均,標準偏差,最小,最大は計算可能。再計算に25秒~45秒かかる(Core i7,2.4GHz)。
確認環境
Excel 2013(64bit) + Windows 10 Pro(64bit)