dieharderというコマンドで、(擬似)乱数の品質が確かめられます。参考:
データの準備
dieharderは検定対象の乱数列を、次の3通りのやり方で指定できます。
- dieharder内で生成する。
- 32ビットの乱数値を羅列したテキストデータを読み込ませる。
- 乱数的なバイト列であるバイナリデータを読み込ませる。
dieharderに用意されていない乱数生成器の品質を確かめるためには、2か3を使う必要があります。処理速度とファイルサイズ節約のため、特に理由がなければバイナリデータを使うほうが良いです。
たとえば、次のようにしてデータを準備します。
head -c 1600000000 /dev/urandom >urandom16gb.bin
下記の記事によれば14GB以上のデータを準備するのが良いそうです。
dieharderによる検定
次のコマンドで検定します。
dieharder -a -g 201 -f urandom16gb.bin
オプションの意味は次のとおりです。
- -a : dieharderが備えているすべてのテストを実行します。
- テストの種類は dieharder -l で一覧できます。すべてのテストが信用できるわけではないみたい。
- -g 201 : バイナリファイルをデータソースとすることを指定しています。
- -f urandom16gb.bin : データソースのファイルを指定します。
Java標準のRandomクラスを検定した結果は次のようになりました。 PASSED=99, WEAK=6, FAILED=9.
#=============================================================================# # dieharder version 3.31.1 Copyright 2003 Robert G. Brown # #=============================================================================# rng_name | filename |rands/second| file_input_raw|/mnt/bulkdata/random/jur-16gb.bin| 3.11e+07 | #=============================================================================# test_name |ntup| tsamples |psamples| p-value |Assessment #=============================================================================# diehard_birthdays| 0| 100| 100|0.72669322| PASSED diehard_operm5| 0| 1000000| 100|0.03050289| PASSED diehard_rank_32x32| 0| 40000| 100|0.01533612| PASSED diehard_rank_6x8| 0| 100000| 100|0.58905064| PASSED diehard_bitstream| 0| 2097152| 100|0.70639485| PASSED diehard_opso| 0| 2097152| 100|0.07155358| PASSED diehard_oqso| 0| 2097152| 100|0.00000000| FAILED diehard_dna| 0| 2097152| 100|0.00000194| WEAK diehard_count_1s_str| 0| 256000| 100|0.62835408| PASSED diehard_count_1s_byt| 0| 256000| 100|0.71589196| PASSED diehard_parking_lot| 0| 12000| 100|0.08663890| PASSED diehard_2dsphere| 2| 8000| 100|0.78454152| PASSED diehard_3dsphere| 3| 4000| 100|0.95156546| PASSED diehard_squeeze| 0| 100000| 100|0.33885873| PASSED diehard_sums| 0| 100| 100|0.49472479| PASSED diehard_runs| 0| 100000| 100|0.54148478| PASSED diehard_runs| 0| 100000| 100|0.62535674| PASSED diehard_craps| 0| 200000| 100|0.05748864| PASSED diehard_craps| 0| 200000| 100|0.00021129| WEAK marsaglia_tsang_gcd| 0| 10000000| 100|0.88689191| PASSED marsaglia_tsang_gcd| 0| 10000000| 100|0.01849371| PASSED sts_monobit| 1| 100000| 100|0.30831283| PASSED sts_runs| 2| 100000| 100|0.29665215| PASSED sts_serial| 1| 100000| 100|0.52969794| PASSED sts_serial| 2| 100000| 100|0.78416613| PASSED sts_serial| 3| 100000| 100|0.49400648| PASSED sts_serial| 3| 100000| 100|0.56845560| PASSED sts_serial| 4| 100000| 100|0.84307666| PASSED sts_serial| 4| 100000| 100|0.54161713| PASSED sts_serial| 5| 100000| 100|0.92570105| PASSED sts_serial| 5| 100000| 100|0.50165713| PASSED sts_serial| 6| 100000| 100|0.10729527| PASSED sts_serial| 6| 100000| 100|0.11689360| PASSED sts_serial| 7| 100000| 100|0.06835401| PASSED sts_serial| 7| 100000| 100|0.20026840| PASSED sts_serial| 8| 100000| 100|0.18512248| PASSED sts_serial| 8| 100000| 100|0.74290582| PASSED sts_serial| 9| 100000| 100|0.22986718| PASSED sts_serial| 9| 100000| 100|0.92393365| PASSED sts_serial| 10| 100000| 100|0.97697602| PASSED sts_serial| 10| 100000| 100|0.69668693| PASSED sts_serial| 11| 100000| 100|0.48535548| PASSED sts_serial| 11| 100000| 100|0.17381354| PASSED sts_serial| 12| 100000| 100|0.47787130| PASSED sts_serial| 12| 100000| 100|0.89494119| PASSED sts_serial| 13| 100000| 100|0.58758639| PASSED sts_serial| 13| 100000| 100|0.72786683| PASSED sts_serial| 14| 100000| 100|0.59086893| PASSED sts_serial| 14| 100000| 100|0.10746105| PASSED sts_serial| 15| 100000| 100|0.07321146| PASSED sts_serial| 15| 100000| 100|0.12971598| PASSED sts_serial| 16| 100000| 100|0.49060338| PASSED sts_serial| 16| 100000| 100|0.69434599| PASSED rgb_bitdist| 1| 100000| 100|0.40655057| PASSED rgb_bitdist| 2| 100000| 100|0.97954629| PASSED rgb_bitdist| 3| 100000| 100|0.80462394| PASSED rgb_bitdist| 4| 100000| 100|0.27732190| PASSED rgb_bitdist| 5| 100000| 100|0.31173331| PASSED rgb_bitdist| 6| 100000| 100|0.67042904| PASSED rgb_bitdist| 7| 100000| 100|0.88116255| PASSED rgb_bitdist| 8| 100000| 100|0.23063630| PASSED rgb_bitdist| 9| 100000| 100|0.78086577| PASSED rgb_bitdist| 10| 100000| 100|0.26566471| PASSED rgb_bitdist| 11| 100000| 100|0.10617109| PASSED rgb_bitdist| 12| 100000| 100|0.83245706| PASSED rgb_minimum_distance| 2| 10000| 1000|0.72614009| PASSED rgb_minimum_distance| 3| 10000| 1000|0.00000000| FAILED rgb_minimum_distance| 4| 10000| 1000|0.00000000| FAILED rgb_minimum_distance| 5| 10000| 1000|0.00000000| FAILED rgb_permutations| 2| 100000| 100|0.98803991| PASSED rgb_permutations| 3| 100000| 100|0.73568197| PASSED rgb_permutations| 4| 100000| 100|0.08482019| PASSED rgb_permutations| 5| 100000| 100|0.70154908| PASSED rgb_lagged_sum| 0| 1000000| 100|0.79496014| PASSED rgb_lagged_sum| 1| 1000000| 100|0.07208100| PASSED rgb_lagged_sum| 2| 1000000| 100|0.86167032| PASSED rgb_lagged_sum| 3| 1000000| 100|0.43927171| PASSED rgb_lagged_sum| 4| 1000000| 100|0.56969903| PASSED rgb_lagged_sum| 5| 1000000| 100|0.10115703| PASSED rgb_lagged_sum| 6| 1000000| 100|0.18739311| PASSED rgb_lagged_sum| 7| 1000000| 100|0.00000001| FAILED rgb_lagged_sum| 8| 1000000| 100|0.91004721| PASSED rgb_lagged_sum| 9| 1000000| 100|0.97610909| PASSED rgb_lagged_sum| 10| 1000000| 100|0.92697666| PASSED rgb_lagged_sum| 11| 1000000| 100|0.00375046| WEAK rgb_lagged_sum| 12| 1000000| 100|0.79648305| PASSED rgb_lagged_sum| 13| 1000000| 100|0.93076076| PASSED rgb_lagged_sum| 14| 1000000| 100|0.99362167| PASSED rgb_lagged_sum| 15| 1000000| 100|0.00000000| FAILED rgb_lagged_sum| 16| 1000000| 100|0.54770009| PASSED rgb_lagged_sum| 17| 1000000| 100|0.99658927| WEAK rgb_lagged_sum| 18| 1000000| 100|0.25300986| PASSED rgb_lagged_sum| 19| 1000000| 100|0.18044250| PASSED rgb_lagged_sum| 20| 1000000| 100|0.65566731| PASSED rgb_lagged_sum| 21| 1000000| 100|0.38256111| PASSED rgb_lagged_sum| 22| 1000000| 100|0.47671481| PASSED rgb_lagged_sum| 23| 1000000| 100|0.00336641| WEAK rgb_lagged_sum| 24| 1000000| 100|0.54378835| PASSED rgb_lagged_sum| 25| 1000000| 100|0.88101595| PASSED rgb_lagged_sum| 26| 1000000| 100|0.51313795| PASSED rgb_lagged_sum| 27| 1000000| 100|0.35416608| PASSED rgb_lagged_sum| 28| 1000000| 100|0.40067185| PASSED rgb_lagged_sum| 29| 1000000| 100|0.05309715| PASSED rgb_lagged_sum| 30| 1000000| 100|0.67111386| PASSED rgb_lagged_sum| 31| 1000000| 100|0.00000000| FAILED rgb_lagged_sum| 32| 1000000| 100|0.53535507| PASSED rgb_kstest_test| 0| 10000| 1000|0.34031162| PASSED dab_bytedistrib| 0| 51200000| 1|1.00000000| FAILED dab_dct| 256| 50000| 1|0.51265001| PASSED dab_filltree| 32| 15000000| 1|0.00000000| FAILED dab_filltree| 32| 15000000| 1|0.00389630| WEAK dab_filltree2| 0| 5000000| 1|0.47415992| PASSED dab_filltree2| 1| 5000000| 1|0.01075152| PASSED dab_monobit2| 12| 65000000| 1|0.23692622| PASSED