疑似乱数生成器を検証します

# はじめに
疑似乱数生成器の計測をしましょう. 疑似乱数生成器に限らず, 計測や調査をしない, "たぶん", "おそらく"で物事を進めないようにしましょう. 

# 疑似乱数生成器
ひとつめは知らない. ふたつめは, [How can I test if CRC32C is a "good" random generator?](https://stackoverflow.com/questions/49867371/how-can-i-test-if-crc32c-is-a-good-random-generator)から. みっつめはPCGです.

<details><summary>random.cpp</summary><div>

```cpp
#include <cstdint>
#include <cstring>
#include <charconv>
#include <functional>
#include <chrono>
#include <vector>
#include <fstream>
#include <iostream>
#include <sstream>
#include <nmmintrin.h>

inline uint32_t crc32_random()
{
#if defined(__GNUC__) || defined(__clang__)
    uint32_t eax, edx;
    __asm__ volatile (
            "rdtsc\n"
            "crc32l %%edx, %%eax"
            : "=a"(eax), "=d" (edx));
    return eax;
#endif
}

uint32_t crc32_random2()
{
    static uint32_t r = 123456U;
    r = _mm_crc32_u32(r, r<<18);
    return r;
}

namespace
{
    inline uint32_t rotr32(uint32_t x, uint32_t r)
    {
        return (x>>r) | (x<<((~r+1)&31U));
    }
}

uint32_t pcg32()
{
    static constexpr uint64_t Increment = 0x14057B7EF767814FULL;
    static constexpr uint64_t  Multiplier = 0x5851F42D4C957F2DULL;
    static uint64_t state = 123456U;
    uint64_t x = state;
    uint32_t count = static_cast<uint32_t>(x>>59);
    state = x*Multiplier + Increment;
    x ^= x>>18;
    return rotr32(static_cast<uint32_t>(x>>27), count);
}

void test(std::function<uint32_t(void)> func, uint32_t count, const char* name)
{
    std::vector<uint32_t> values;
    values.resize(count);
    std::chrono::time_point start = std::chrono::high_resolution_clock::now();
    for(uint32_t i=0; i<count; ++i){
        values[i] = func();
    }
    std::chrono::duration duration = std::chrono::high_resolution_clock::now() - start;
    std::ostringstream oss;
    oss << name << ".bin";
    std::string filename = oss.str();
    std::ofstream file(filename.c_str(), std::ios::binary);
    file.write(reinterpret_cast<char*>(&values[0]), sizeof(uint32_t)*values.size());
    file.close();
    std::cout << name << ": " << std::chrono::duration_cast<std::chrono::microseconds>(duration).count() << " microseconds" << std::endl;
}

int main(int /*arc*/, char** argv)
{
    int32_t count = 0;
    std::string arg = argv[1];
    std::from_chars(arg.c_str(), arg.c_str()+arg.length(), count); 
    test(crc32_random, static_cast<uint32_t>(count), "crc32");
    test(crc32_random2, static_cast<uint32_t>(count), "crc32_2");
    test(pcg32, static_cast<uint32_t>(count), "pcg32");
    return 0;
}
```
</div></details>

# DieHarder

[DieHarder](https://webhome.phy.duke.edu/~rgb/General/dieharder.php)を使って品質を検証します. ソースからビルドする手間を省いてUbuntuのパッケージを使いました.

```
$ apt install dieharder
```

4バイトの乱数列が並んだバイナリファイルに対して, 全てのテストを実行するには次のようにします.

```
$ dieharder -a -g 201 -f crc32.bin
```

# 結果

## 環境

コンパイラとオプションです.

```
$ g++ --version
g++ (Ubuntu 9.4.0-1ubuntu1~20.04) 9.4.0
$ g++ -std=c++17 -O2 -march=skylake random.cpp -o random
```

CPUです.

<details><summary>lscpu</summary><div>

```
Architecture:                    x86_64
CPU op-mode(s):                  32-bit, 64-bit
Byte Order:                      Little Endian
Address sizes:                   39 bits physical, 48 bits virtual
CPU(s):                          8
On-line CPU(s) list:             0-7
Thread(s) per core:              2
Core(s) per socket:              4
Socket(s):                       1
NUMA node(s):                    1
Vendor ID:                       GenuineIntel
CPU family:                      6
Model:                           142
Model name:                      Intel(R) Core(TM) i5-10210U CPU @ 1.60GHz
Stepping:                        12
CPU MHz:                         2100.000
CPU max MHz:                     4200.0000
CPU min MHz:                     400.0000
BogoMIPS:                        4199.88
Virtualization:                  VT-x
L1d cache:                       128 KiB
L1i cache:                       128 KiB
L2 cache:                        1 MiB
L3 cache:                        6 MiB
NUMA node0 CPU(s):               0-7
Vulnerability Itlb multihit:     KVM: Mitigation: VMX disabled
Vulnerability L1tf:              Not affected
Vulnerability Mds:               Not affected
Vulnerability Meltdown:          Not affected
Vulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl and seccomp
Vulnerability Spectre v1:        Mitigation; usercopy/swapgs barriers and __user pointer sanitization
Vulnerability Spectre v2:        Mitigation; Enhanced IBRS, IBPB conditional, RSB filling
Vulnerability Srbds:             Mitigation; TSX disabled
Vulnerability Tsx async abort:   Not affected
Flags:                           fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts
                                  acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art 
                                 arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclm
                                 ulqdq dtes64 monitor ds_cpl vmx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid sse4_1 s
                                 se4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 
                                 3dnowprefetch cpuid_fault epb invpcid_single ssbd ibrs ibpb stibp ibrs_enhanced tpr
                                 _shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust sgx bmi1 avx2 smep bm
                                 i2 erms invpcid mpx rdseed adx smap clflushopt intel_pt xsaveopt xsavec xgetbv1 xsa
                                 ves dtherm ida arat pln pts hwp hwp_notify hwp_act_window hwp_epp md_clear flush_l1
                                 d arch_capabilities
```
</div></details>

テストデータは上記プログラムを, 次の引数で実行しました.

```
$ ./random 268435456
```

## 実行時間

| 生成器 | 時間 |
| :--- | :--- |
| crc32 | 1,606,235 microseconds |
| crc32_2 | 515,165 microseconds |
| pcg32 | 579,748 microseconds |

## テスト結果
### CRC32?
未編集でそのままですが, 失敗が多過ぎです.

<details><summary>crc32</summary><div>

```
#=============================================================================#
#            dieharder version 3.31.1 Copyright 2003 Robert G. Brown          #
#=============================================================================#
   rng_name    |           filename             |rands/second|
 file_input_raw|                       crc32.bin|  6.47e+07  |
#=============================================================================#
        test_name   |ntup| tsamples |psamples|  p-value |Assessment
#=============================================================================#
   diehard_birthdays|   0|       100|     100|0.00000000|  FAILED  
      diehard_operm5|   0|   1000000|     100|0.00000000|  FAILED  
  diehard_rank_32x32|   0|     40000|     100|0.00000000|  FAILED  
    diehard_rank_6x8|   0|    100000|     100|0.00000000|  FAILED  
   diehard_bitstream|   0|   2097152|     100|0.00000000|  FAILED  
        diehard_opso|   0|   2097152|     100|0.00000000|  FAILED  
        diehard_oqso|   0|   2097152|     100|0.00000000|  FAILED  
         diehard_dna|   0|   2097152|     100|0.00000000|  FAILED  
diehard_count_1s_str|   0|    256000|     100|0.00000000|  FAILED  
diehard_count_1s_byt|   0|    256000|     100|0.00000000|  FAILED  
 diehard_parking_lot|   0|     12000|     100|0.00000000|  FAILED  
    diehard_2dsphere|   2|      8000|     100|0.00000000|  FAILED  
    diehard_3dsphere|   3|      4000|     100|0.00000000|  FAILED  
     diehard_squeeze|   0|    100000|     100|0.00000000|  FAILED  
        diehard_sums|   0|       100|     100|0.01661655|  PASSED  
        diehard_runs|   0|    100000|     100|0.00000000|  FAILED  
        diehard_runs|   0|    100000|     100|0.00000000|  FAILED  
       diehard_craps|   0|    200000|     100|0.00000000|  FAILED  
       diehard_craps|   0|    200000|     100|0.00000000|  FAILED  
 marsaglia_tsang_gcd|   0|  10000000|     100|0.00000000|  FAILED  
 marsaglia_tsang_gcd|   0|  10000000|     100|0.00000000|  FAILED  
         sts_monobit|   1|    100000|     100|0.11443577|  PASSED  
            sts_runs|   2|    100000|     100|0.74085909|  PASSED  
          sts_serial|   1|    100000|     100|0.28523649|  PASSED  
          sts_serial|   2|    100000|     100|0.00000112|   WEAK   
          sts_serial|   3|    100000|     100|0.00007387|   WEAK   
          sts_serial|   3|    100000|     100|0.28541894|  PASSED  
          sts_serial|   4|    100000|     100|0.97027219|  PASSED  
          sts_serial|   4|    100000|     100|0.00060930|   WEAK   
          sts_serial|   5|    100000|     100|0.61673590|  PASSED  
          sts_serial|   5|    100000|     100|0.69267033|  PASSED  
          sts_serial|   6|    100000|     100|0.00037420|   WEAK   
          sts_serial|   6|    100000|     100|0.00000001|  FAILED  
          sts_serial|   7|    100000|     100|0.00000000|  FAILED  
          sts_serial|   7|    100000|     100|0.00000001|  FAILED  
          sts_serial|   8|    100000|     100|0.00000000|  FAILED  
          sts_serial|   8|    100000|     100|0.00000000|  FAILED  
          sts_serial|   9|    100000|     100|0.00000000|  FAILED  
          sts_serial|   9|    100000|     100|0.00000000|  FAILED  
          sts_serial|  10|    100000|     100|0.00000000|  FAILED  
          sts_serial|  10|    100000|     100|0.00000000|  FAILED  
          sts_serial|  11|    100000|     100|0.00000000|  FAILED  
          sts_serial|  11|    100000|     100|0.00000000|  FAILED  
          sts_serial|  12|    100000|     100|0.00000000|  FAILED  
          sts_serial|  12|    100000|     100|0.00000000|  FAILED  
          sts_serial|  13|    100000|     100|0.00000000|  FAILED  
          sts_serial|  13|    100000|     100|0.00000000|  FAILED  
          sts_serial|  14|    100000|     100|0.00000000|  FAILED  
          sts_serial|  14|    100000|     100|0.00000000|  FAILED  
          sts_serial|  15|    100000|     100|0.00000000|  FAILED  
          sts_serial|  15|    100000|     100|0.00000000|  FAILED  
          sts_serial|  16|    100000|     100|0.00000000|  FAILED  
          sts_serial|  16|    100000|     100|0.00000000|  FAILED  
         rgb_bitdist|   1|    100000|     100|0.00000000|  FAILED  
         rgb_bitdist|   2|    100000|     100|0.00000000|  FAILED  
         rgb_bitdist|   3|    100000|     100|0.00000000|  FAILED  
         rgb_bitdist|   4|    100000|     100|0.00000000|  FAILED  
         rgb_bitdist|   5|    100000|     100|0.00000000|  FAILED  
         rgb_bitdist|   6|    100000|     100|0.00000000|  FAILED  
         rgb_bitdist|   7|    100000|     100|0.00000000|  FAILED  
         rgb_bitdist|   8|    100000|     100|0.00000000|  FAILED  
         rgb_bitdist|   9|    100000|     100|0.00004402|   WEAK   
         rgb_bitdist|  10|    100000|     100|0.14882915|  PASSED  
         rgb_bitdist|  11|    100000|     100|0.72958774|  PASSED  
         rgb_bitdist|  12|    100000|     100|0.98409836|  PASSED  
rgb_minimum_distance|   2|     10000|    1000|0.00000000|  FAILED  
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.25841978|  PASSED  
    rgb_permutations|   3|    100000|     100|0.00000000|  FAILED  
    rgb_permutations|   4|    100000|     100|0.00000000|  FAILED  
    rgb_permutations|   5|    100000|     100|0.00000000|  FAILED  
      rgb_lagged_sum|   0|   1000000|     100|0.32966556|  PASSED  
      rgb_lagged_sum|   1|   1000000|     100|0.15913695|  PASSED  
      rgb_lagged_sum|   2|   1000000|     100|0.08897389|  PASSED  
      rgb_lagged_sum|   3|   1000000|     100|0.04053730|  PASSED  
      rgb_lagged_sum|   4|   1000000|     100|0.13849723|  PASSED  
      rgb_lagged_sum|   5|   1000000|     100|0.07664901|  PASSED  
      rgb_lagged_sum|   6|   1000000|     100|0.65775607|  PASSED  
      rgb_lagged_sum|   7|   1000000|     100|0.46420673|  PASSED  
      rgb_lagged_sum|   8|   1000000|     100|0.72410204|  PASSED  
      rgb_lagged_sum|   9|   1000000|     100|0.18669990|  PASSED  
      rgb_lagged_sum|  10|   1000000|     100|0.82862357|  PASSED  
      rgb_lagged_sum|  11|   1000000|     100|0.14894108|  PASSED  
      rgb_lagged_sum|  12|   1000000|     100|0.21143731|  PASSED  
      rgb_lagged_sum|  13|   1000000|     100|0.35191178|  PASSED  
      rgb_lagged_sum|  14|   1000000|     100|0.40627558|  PASSED  
      rgb_lagged_sum|  15|   1000000|     100|0.49954236|  PASSED  
      rgb_lagged_sum|  16|   1000000|     100|0.32340207|  PASSED  
      rgb_lagged_sum|  17|   1000000|     100|0.21871723|  PASSED  
      rgb_lagged_sum|  18|   1000000|     100|0.13077551|  PASSED  
      rgb_lagged_sum|  19|   1000000|     100|0.13648137|  PASSED  
      rgb_lagged_sum|  20|   1000000|     100|0.37977881|  PASSED  
      rgb_lagged_sum|  21|   1000000|     100|0.38020476|  PASSED  
      rgb_lagged_sum|  22|   1000000|     100|0.65908700|  PASSED  
      rgb_lagged_sum|  23|   1000000|     100|0.97132587|  PASSED  
      rgb_lagged_sum|  24|   1000000|     100|0.53150748|  PASSED  
      rgb_lagged_sum|  25|   1000000|     100|0.23999269|  PASSED  
      rgb_lagged_sum|  26|   1000000|     100|0.40134130|  PASSED  
      rgb_lagged_sum|  27|   1000000|     100|0.40826578|  PASSED  
      rgb_lagged_sum|  28|   1000000|     100|0.49287397|  PASSED  
      rgb_lagged_sum|  29|   1000000|     100|0.84180797|  PASSED  
      rgb_lagged_sum|  30|   1000000|     100|0.93236271|  PASSED  
      rgb_lagged_sum|  31|   1000000|     100|0.20939033|  PASSED  
      rgb_lagged_sum|  32|   1000000|     100|0.57051539|  PASSED  
     rgb_kstest_test|   0|     10000|    1000|0.00000000|  FAILED  
     dab_bytedistrib|   0|  51200000|       1|0.00001192|   WEAK   
             dab_dct| 256|     50000|       1|0.00000000|  FAILED  
Preparing to run test 207.  ntuple = 0
        dab_filltree|  32|  15000000|       1|0.00000000|  FAILED  
        dab_filltree|  32|  15000000|       1|0.00000000|  FAILED  
Preparing to run test 208.  ntuple = 0
       dab_filltree2|   0|   5000000|       1|0.00000000|  FAILED  
       dab_filltree2|   1|   5000000|       1|0.00000000|  FAILED  
Preparing to run test 209.  ntuple = 0
        dab_monobit2|  12|  65000000|       1|1.00000000|  FAILED  
```
</div></details>

### CRC32-2
パスしなかったテストだけ記載します. 少ない, 気持ちいい, 編集し甲斐があります. 品質は結構優秀とはいえ, xorshiftの変種を使えばいいし, 移植性を考えると微妙な性能と思います.

```
#=============================================================================#
#            dieharder version 3.31.1 Copyright 2003 Robert G. Brown          #
#=============================================================================#
   rng_name    |           filename             |rands/second|
 file_input_raw|                     crc32_2.bin|  6.02e+07  |
#=============================================================================#
        test_name   |ntup| tsamples |psamples|  p-value |Assessment
#=============================================================================#
  diehard_rank_32x32|   0|     40000|     100|0.00000000|  FAILED  
 marsaglia_tsang_gcd|   0|  10000000|     100|0.00000474|   WEAK   
          sts_serial|  13|    100000|     100|0.99792028|   WEAK   
          sts_serial|  14|    100000|     100|0.99911806|   WEAK   
rgb_minimum_distance|   3|     10000|    1000|0.00000021|  FAILED  
rgb_minimum_distance|   4|     10000|    1000|0.00141867|   WEAK   
    rgb_permutations|   5|    100000|     100|0.99779808|   WEAK   
      rgb_lagged_sum|  29|   1000000|     100|0.99701987|   WEAK   
      rgb_lagged_sum|  31|   1000000|     100|0.00007929|   WEAK   
```

### PCG32
特殊な命令を使わないため移植性が高く, 速度と品質のバランスがいいです, 編集楽です, `FAILED`がないとか心洗われる.

```
#=============================================================================#
#            dieharder version 3.31.1 Copyright 2003 Robert G. Brown          #
#=============================================================================#
   rng_name    |           filename             |rands/second|
 file_input_raw|                       pcg32.bin|  5.95e+07  |
#=============================================================================#
        test_name   |ntup| tsamples |psamples|  p-value |Assessment
#=============================================================================#
        diehard_runs|   0|    100000|     100|0.99992228|   WEAK   
          sts_serial|   9|    100000|     100|0.99758599|   WEAK   
         rgb_bitdist|   9|    100000|     100|0.99947097|   WEAK   
      rgb_lagged_sum|   7|   1000000|     100|0.00001093|   WEAK   
      rgb_lagged_sum|   8|   1000000|     100|0.00168199|   WEAK   
      rgb_lagged_sum|   9|   1000000|     100|0.00250357|   WEAK   
      rgb_lagged_sum|  15|   1000000|     100|0.00004920|   WEAK   
      rgb_lagged_sum|  19|   1000000|     100|0.00376622|   WEAK   
      rgb_lagged_sum|  23|   1000000|     100|0.00031668|   WEAK   
```

# まとめ
xorshift32ですらほとんどのテストをパスするので, かなり品質が悪いといっていいでしょう. 速度もRDTSC命令はそんなに速くない, これでもアウトオブオーダー対策をしていないので, まともな実装より速いはずなのです.
さすPCG.
誤り検出を目的としたハッシュ関数を別の目的に使うのは間違っていますよね？という当たり前の結果だと思います. AES-NIの方がましじゃないですかね.

# おまけ
## IBM RANDUよりだめじゃね？
流石にそれはないですよね, しかし性質が解っているので後加工もありならRANDUの方がましじゃないでしょうか.

<details><summary>RANDU</summary><div>

```
#=============================================================================#
#            dieharder version 3.31.1 Copyright 2003 Robert G. Brown          #
#=============================================================================#
   rng_name    |           filename             |rands/second|
 file_input_raw|                       randu.bin|  6.07e+07  |
#=============================================================================#
        test_name   |ntup| tsamples |psamples|  p-value |Assessment
#=============================================================================#
   diehard_birthdays|   0|       100|     100|0.00000000|  FAILED  
      diehard_operm5|   0|   1000000|     100|0.00000000|  FAILED  
  diehard_rank_32x32|   0|     40000|     100|0.00000000|  FAILED  
    diehard_rank_6x8|   0|    100000|     100|0.00000000|  FAILED  
   diehard_bitstream|   0|   2097152|     100|0.00000000|  FAILED  
        diehard_opso|   0|   2097152|     100|0.00000000|  FAILED  
        diehard_oqso|   0|   2097152|     100|0.00000000|  FAILED  
         diehard_dna|   0|   2097152|     100|0.00000000|  FAILED  
diehard_count_1s_str|   0|    256000|     100|0.00000000|  FAILED  
diehard_count_1s_byt|   0|    256000|     100|0.00000000|  FAILED  
 diehard_parking_lot|   0|     12000|     100|0.00000000|  FAILED  
    diehard_2dsphere|   2|      8000|     100|0.00000000|  FAILED  
    diehard_3dsphere|   3|      4000|     100|0.00000000|  FAILED  
     diehard_squeeze|   0|    100000|     100|0.00000000|  FAILED  
        diehard_sums|   0|       100|     100|0.00000000|  FAILED  
        diehard_runs|   0|    100000|     100|0.65823037|  PASSED  
        diehard_runs|   0|    100000|     100|0.00002074|   WEAK   
       diehard_craps|   0|    200000|     100|0.00000000|  FAILED  
       diehard_craps|   0|    200000|     100|0.00000000|  FAILED  
 marsaglia_tsang_gcd|   0|  10000000|     100|0.00000000|  FAILED  
 marsaglia_tsang_gcd|   0|  10000000|     100|0.00000000|  FAILED  
         sts_monobit|   1|    100000|     100|0.00000000|  FAILED  
            sts_runs|   2|    100000|     100|0.00000000|  FAILED  
          sts_serial|   1|    100000|     100|0.00000000|  FAILED  
          sts_serial|   2|    100000|     100|0.00000000|  FAILED  
          sts_serial|   3|    100000|     100|0.00000000|  FAILED  
          sts_serial|   3|    100000|     100|0.00000000|  FAILED  
          sts_serial|   4|    100000|     100|0.00000000|  FAILED  
          sts_serial|   4|    100000|     100|0.00000000|  FAILED  
          sts_serial|   5|    100000|     100|0.00000000|  FAILED  
          sts_serial|   5|    100000|     100|0.00000000|  FAILED  
          sts_serial|   6|    100000|     100|0.00000000|  FAILED  
          sts_serial|   6|    100000|     100|0.00000000|  FAILED  
          sts_serial|   7|    100000|     100|0.00000000|  FAILED  
          sts_serial|   7|    100000|     100|0.00000000|  FAILED  
          sts_serial|   8|    100000|     100|0.00000000|  FAILED  
          sts_serial|   8|    100000|     100|0.00000000|  FAILED  
          sts_serial|   9|    100000|     100|0.00000000|  FAILED  
          sts_serial|   9|    100000|     100|0.00000000|  FAILED  
          sts_serial|  10|    100000|     100|0.00000000|  FAILED  
          sts_serial|  10|    100000|     100|0.00000000|  FAILED  
          sts_serial|  11|    100000|     100|0.00000000|  FAILED  
          sts_serial|  11|    100000|     100|0.00000000|  FAILED  
          sts_serial|  12|    100000|     100|0.00000000|  FAILED  
          sts_serial|  12|    100000|     100|0.00000000|  FAILED  
          sts_serial|  13|    100000|     100|0.00000000|  FAILED  
          sts_serial|  13|    100000|     100|0.00000000|  FAILED  
          sts_serial|  14|    100000|     100|0.00000000|  FAILED  
          sts_serial|  14|    100000|     100|0.00000000|  FAILED  
          sts_serial|  15|    100000|     100|0.00000000|  FAILED  
          sts_serial|  15|    100000|     100|0.00000000|  FAILED  
          sts_serial|  16|    100000|     100|0.00000000|  FAILED  
          sts_serial|  16|    100000|     100|0.00000000|  FAILED  
         rgb_bitdist|   1|    100000|     100|0.00000000|  FAILED  
         rgb_bitdist|   2|    100000|     100|0.00000000|  FAILED  
         rgb_bitdist|   3|    100000|     100|0.00000000|  FAILED  
         rgb_bitdist|   4|    100000|     100|0.00000000|  FAILED  
         rgb_bitdist|   5|    100000|     100|0.00000000|  FAILED  
         rgb_bitdist|   6|    100000|     100|0.00000000|  FAILED  
         rgb_bitdist|   7|    100000|     100|0.00000000|  FAILED  
         rgb_bitdist|   8|    100000|     100|0.00000000|  FAILED  
         rgb_bitdist|   9|    100000|     100|0.00000000|  FAILED  
         rgb_bitdist|  10|    100000|     100|0.00000000|  FAILED  
         rgb_bitdist|  11|    100000|     100|0.00000000|  FAILED  
         rgb_bitdist|  12|    100000|     100|0.00000000|  FAILED  
rgb_minimum_distance|   2|     10000|    1000|0.00000000|  FAILED  
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.34071975|  PASSED  
    rgb_permutations|   3|    100000|     100|0.41896992|  PASSED  
    rgb_permutations|   4|    100000|     100|0.02984451|  PASSED  
    rgb_permutations|   5|    100000|     100|0.00000002|  FAILED  
      rgb_lagged_sum|   0|   1000000|     100|0.00000000|  FAILED  
      rgb_lagged_sum|   1|   1000000|     100|0.00000000|  FAILED  
      rgb_lagged_sum|   2|   1000000|     100|0.00000000|  FAILED  
      rgb_lagged_sum|   3|   1000000|     100|0.00000000|  FAILED  
      rgb_lagged_sum|   4|   1000000|     100|0.00000000|  FAILED  
      rgb_lagged_sum|   5|   1000000|     100|0.00000000|  FAILED  
      rgb_lagged_sum|   6|   1000000|     100|0.00000000|  FAILED  
      rgb_lagged_sum|   7|   1000000|     100|0.00000000|  FAILED  
      rgb_lagged_sum|   8|   1000000|     100|0.00000000|  FAILED  
      rgb_lagged_sum|   9|   1000000|     100|0.00000000|  FAILED  
      rgb_lagged_sum|  10|   1000000|     100|0.00000000|  FAILED  
      rgb_lagged_sum|  11|   1000000|     100|0.00000000|  FAILED  
      rgb_lagged_sum|  12|   1000000|     100|0.00000000|  FAILED  
      rgb_lagged_sum|  13|   1000000|     100|0.00000000|  FAILED  
      rgb_lagged_sum|  14|   1000000|     100|0.00000000|  FAILED  
      rgb_lagged_sum|  15|   1000000|     100|0.00000000|  FAILED  
      rgb_lagged_sum|  16|   1000000|     100|0.00000000|  FAILED  
      rgb_lagged_sum|  17|   1000000|     100|0.00000000|  FAILED  
      rgb_lagged_sum|  18|   1000000|     100|0.00000000|  FAILED  
      rgb_lagged_sum|  19|   1000000|     100|0.00000000|  FAILED  
      rgb_lagged_sum|  20|   1000000|     100|0.00000000|  FAILED  
      rgb_lagged_sum|  21|   1000000|     100|0.00000000|  FAILED  
      rgb_lagged_sum|  22|   1000000|     100|0.00000000|  FAILED  
      rgb_lagged_sum|  23|   1000000|     100|0.00000000|  FAILED  
      rgb_lagged_sum|  24|   1000000|     100|0.00000000|  FAILED  
      rgb_lagged_sum|  25|   1000000|     100|0.00000000|  FAILED  
      rgb_lagged_sum|  26|   1000000|     100|0.00000000|  FAILED  
      rgb_lagged_sum|  27|   1000000|     100|0.00000000|  FAILED  
      rgb_lagged_sum|  28|   1000000|     100|0.00000000|  FAILED  
      rgb_lagged_sum|  29|   1000000|     100|0.00000000|  FAILED  
      rgb_lagged_sum|  30|   1000000|     100|0.00000000|  FAILED  
      rgb_lagged_sum|  31|   1000000|     100|0.00000000|  FAILED  
      rgb_lagged_sum|  32|   1000000|     100|0.00000000|  FAILED  
     rgb_kstest_test|   0|     10000|    1000|0.00000000|  FAILED  
     dab_bytedistrib|   0|  51200000|       1|0.00000000|  FAILED  
             dab_dct| 256|     50000|       1|0.00000000|  FAILED  
Preparing to run test 207.  ntuple = 0
        dab_filltree|  32|  15000000|       1|0.00000000|  FAILED  
        dab_filltree|  32|  15000000|       1|0.00000000|  FAILED  
Preparing to run test 208.  ntuple = 0
       dab_filltree2|   0|   5000000|       1|0.00000000|  FAILED  
       dab_filltree2|   1|   5000000|       1|0.00000000|  FAILED  
Preparing to run test 209.  ntuple = 0
        dab_monobit2|  12|  65000000|       1|1.00000000|  FAILED 
```
</div></details>