dieharderコマンドで乱数の品質を検定する

dieharderというコマンドで、(擬似)乱数の品質が確かめられます。参考:

インストール

Ubuntu 14.04であれば、デフォルトのAptリポジトリに入っているため、次のコマンドでインストールできます。

sudo apt-get install dieharder

データの準備

dieharderは検定対象の乱数列を、次の3通りのやり方で指定できます。

  1. dieharder内で生成する。
  2. 32ビットの乱数値を羅列したテキストデータを読み込ませる。
  3. 乱数的なバイト列であるバイナリデータを読み込ませる。

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