乱数アルゴリズムの試用ツールとしてのStreamRelay.NET.exe

いくつかの乱数アルゴリズムをお試しする事ができる

---
### 乱数アルゴリズムの一覧

`StreamRelay.NET.exe -ListRandomize`

一例だとこんな感じ
> C:\>StreamRelay.NET.exe -ListRandomize
>    ------------------------------------------------
>    Randomize is
>Random       :System.Random
>CryptoRandom       :System.Security.Cryptography.RNGCryptoServiceProvider
>MT       :Mersenne Twister (Meisui.Random)
>PBKDF1       :System.Security.Cryptography.PasswordDeriveBytes
>PBKDF2/<PasswordHex>/<SaltHex>/<Interaction>       :System.Security.Cryptography.Rfc2898DeriveBytes
>NoRandom       :Increment(NoRandom)
>BouncyCastleRandom       :SecureRandom(Org.BouncyCastle.Security.SecureRandom) (
>BouncyCastle.Crypto.dll)
>BC_VmpcRandom       :VmpcRandom (BouncyCastle.Crypto.dll)
>CmdRandom       :CmdRandom (Environment(cmd.exe) RANDOM
>MersenneTwister       :MersenneTwister (Rei.Random.dll)
>SFMT       :SFMT (Rei.Random.dll)
>LCG       :LCG (Rei.Random.dll)
>MotherOfAll       :MotherOfAll (Rei.Random.dll)
>RanrotB       :RanrotB (Rei.Random.dll)
>XorShift       :XorShift (Rei.Random.dll)
>Well       :Well (Rei.Random.dll)
>RAND       :rand  (Win32 API)
>RAND_S       :rand_s(Win32 API)
>RdRand       :RdRand(use Intel CPU{Ivy Bridge})

---
### 乱数アルゴリズムの試用ツールとしてのStreamRelay.NET.exe

`-ListRndNumber` で乱数の範囲とアルゴリズムを決めて、`-ListRndNumberCount` で回数を決める

`StreamRelay.NET.exe -ListRndNumber 3-100,Random -ListRndNumber 3-100,CryptoRandom -ListRndNumberCount 20`

だと、最小値=3、最大値=100の間で、アルゴリズムは「Random」と「CryptoRandom」で20回実行する。

という意味になる

こんな感じ

>C:\>StreamRelay.NET.exe -ListRndNumber 3-100,Random -ListRndNumber 3-100,CryptoRandom -ListRndNumberCount 20
>,Random,CryptoRandom
>, 40  85
>, 58  89
>, 41  95
>, 34  32
>,  5  27
>, 45  29
>,  3  84
>, 62  15
>, 97   4
>, 19  74
>,  4  59
>,  4  34
>, 95   3
>, 85  13
>, 15  12
>, 93  35
>, 13  66
>, 27  17
>, 91  91
>, 29  81

---
### 実行時間(-Verbsoe)

`-Verbose` つけると実行時間を表示する

こんな感じ

>C:\>StreamRelay.NET.exe -ListRndNumber 3-100,Random -ListRndNumber 3-100,CryptoRandom -ListRndNumberCount 20 -verbose
>1970/01/01 13:39:29
>
>,Random,CryptoRandom
>, 53  39
>, 94  85
>, 81  46
>, 71  31
>, 26  42
>,  8  48
>, 23  31
>, 97  72
>, 28  47
>, 62  64
>,  7  66
>, 22  62
>, 10   4
>, 55  74
>, 40  62
>, 39  78
>, 40  94
>, 33   4
>, 36   4
>, 88  56
>1970/01/01 13:39:29
>
>0.0312sec
>31.2ms

---
### アルゴリズムの説明

<dl>
 <dt>Random
  <dd>.NET Framework標準の<a href="https://msdn.microsoft.com/ja-jp/library/system.random(v=vs.110).aspx">System.Random</a>クラス
 <dt>CryptoRandom
  <dd>.NET Framework標準の<a href="https://msdn.microsoft.com/ja-jp/library/system.security.cryptography.rngcryptoserviceprovider(v=vs.110).aspx">System.Security.Cryptography.RNGCryptoServiceProvider</a>クラス
 <dt>NoRandom
  <dd>これは、最小値から+1ずつしていくので、乱数ではないよ
 <dt>PBKDF1
  <dd>.NET Framework標準のパスワード攪拌の<a href="https://msdn.microsoft.com/ja-jp/library/system.security.cryptography.passwordderivebytes(v=vs.110).aspx">System.Security.Cryptography.PasswordDeriveBytes</a>クラスを乱数のように呼び出してみた
 <dt>PBKDF2/"PasswordHex"/"SaltHex"/"Interaction"       
  <dd>.NET Framework標準のパスワード攪拌の<a href="https://msdn.microsoft.com/ja-jp/library/system.security.cryptography.rfc2898derivebytes(v=vs.110).aspx">System.Security.Cryptography.Rfc2898DeriveBytes</a>クラスを乱数のように呼び出してみた
 <dt>RdRand
  <dd>Intel CPUのIvy Bridge以降のハードウェア乱数器RdRand (Win32\Plugin.RdRand.x86.dll と Win64\Plugin.RdRand.x64.dll と <a href="https://github.com/viathefalcon/rdrand_msvc_2010">RdRandLib.dll</a> で実装されている)
 <dt>RAND
  <dd>Win32APIの<a href="https://msdn.microsoft.com/en-us/library/398ax69y.aspx">rand()</a>をVC++/CLI経由で呼び出してみた。(Win32\CRandom32.dll と Win64\CRandom64.dll で実装されている)
 <dt>RAND_S
  <dd>Win32APIの<a href="https://msdn.microsoft.com/en-us/library/sxtz2fa8.aspx">rand_s()</a>をVC++/CLI経由で呼び出してみた。(Win32\CRandom32.dll と Win64\CRandom64.dll で実装されている)
 <dt>MT
  <dd>Mersenne Twister (<a href="http://meisui.psk.jp/mt19937ar.cs">Meisui.Random</a>)
 <dt>BouncyCastleRandom
  <dd>SecureRandom(Org.BouncyCastle.Security.SecureRandomクラス) (<a href="https://bouncycastle.org/csharp/index.html">BouncyCastle.Crypto.dll</a> を Plugin.BouncyCastle.Crypto.dll 経由で呼び出し)
 <dt>BC_VmpcRandom
  <dd>VmpcRandomGenerator(Org.BouncyCastle.Crypto.Prng.VmpcRandomGeneratorクラス) (<a HREF="https://bouncycastle.org/csharp/index.html">BouncyCastle.Crypto.dll</a> を Plugin.BouncyCastle.Crypto.dll 経由で呼び出し)
 <dt>MersenneTwister
  <dd><a href="http://www.rei.to/random.html">Rei.Random.dll</a> を Plugin.Rei.Random.dll経由で呼び出し
 <dt>SFMT
  <dd><a href="http://www.rei.to/random.html">Rei.Random.dll</a> を Plugin.Rei.Random.dll経由で呼び出し
 <dt>LCG
  <dd><a href="http://www.rei.to/random.html">Rei.Random.dll</a> を Plugin.Rei.Random.dll経由で呼び出し
 <dt>MotherOfAll
  <dd><a href="http://www.rei.to/random.html">Rei.Random.dll</a> を Plugin.Rei.Random.dll経由で呼び出し
 <dt>RanrotB
  <dd><a href="http://www.rei.to/random.html">Rei.Random.dll</a> を Plugin.Rei.Random.dll経由で呼び出し
 <dt>XorShift
  <dd><a href="http://www.rei.to/random.html">Rei.Random.dll</a> を Plugin.Rei.Random.dll経由で呼び出し
 <dt>Well
  <dd><a href="http://www.rei.to/random.html">Rei.Random.dll</a> を Plugin.Rei.Random.dll経由で呼び出し
 <dt>CmdRandom
  <dd>cmd.exe の環境変数RANDOMの値。秒がシードなのかすばやく実行すると同じ値が連続するよ。Plugin.CmdRandom.dll に実装した
</dl>

---
### 目次へ戻る

[目次というか最初の一歩](http://qiita.com/tomoki0sanaki/items/85f20cbe18378e33cd6f)