2017-09-19 15 views
-7

私はC#でSFMT prngライブラリを使用して安全な乱数を生成したいが、それは長いint(=> 19桁の数字)では機能しない。 SFMT PRNG(mersenne twister)をC#でlong intに使用する方法についてのヒントを教えてください。20桁の乱数を生成する方法は?

Randoms.next(int min、int max); しかし、long intの使い方は?

+0

10桁の数字を2つ生成して一緒に結合しますか? –

+6

*動作していないとはどういう意味ですか?あなたのコードを表示し、どんな結果が得られ、何を期待するかを示します。 – HimBromBeere

+0

@ KenY-Nおそらく、そのようなメソッドの方が数学的な質が低い(分散、ランダム性など) –

答えて

1

次のように、ランダムのための拡張メソッドを書くことができます。

public static class RandomExt 
{ 
    public static long NextLong(this Random self, long min, long max) 
    { 
     // Get a random 64 bit number. 

     var buf = new byte[sizeof(ulong)]; 
     self.NextBytes(buf); 
     ulong n = BitConverter.ToUInt64(buf, 0); 

     // Scale to between 0 inclusive and 1 exclusive; i.e. [0,1). 

     double normalised = n/(ulong.MaxValue + 1.0); 

     // Determine result by scaling range and adding minimum. 

     double range = (double)max - min; 

     return (long)(normalised * range) + min; 
    } 

    public static ulong NextULong(this Random self, ulong min, ulong max) 
    { 
     // Get a random 64 bit number. 

     var buf = new byte[sizeof(ulong)]; 
     self.NextBytes(buf); 
     ulong n = BitConverter.ToUInt64(buf, 0); 

     // Scale to between 0 inclusive and 1 exclusive; i.e. [0,1). 

     double normalised = n/(ulong.MaxValue + 1.0); 

     // Determine result by scaling range and adding minimum. 

     double range = (double)max - min; 

     return (ulong)(normalised * range) + min; 
    } 
} 

を(私は範囲内のランダムな二重を作成するために使用されるアルゴリズム[0,1)は、Randomクラスによって使用されたものと同じです。私はushortではなくulongを使用するように変換を除く)すると

あなたはこれを行うことができます。

var rng = new Random(); 
ulong randomNumber = rng.NextULong(1000000000000000, 9999999999999999999); 

は、理想的には、使用したいですより長い乱数ジェネレータ(XOR-SHIFTなど)を長い期間使用すると、指定した範囲の乱数が与えられます。

関連する問題