2013-03-17 3 views
5

私はC#のシードに基づいて数値を生成しようとしています。唯一の問題は、シードが大きすぎてint32にならないことです。私は種子として長く使うことができる方法はありますか?C#Random(Long)

はい、シードは長い必要があります。

+0

なぜシード*が長くてはならないのか説明してください。 :)間違ったやり方で何かしようとしているようです。 – J0HN

+0

擬似乱数に長いシードが必要なのはなぜですか? – tomsv

+0

@ J0HNミネクラフトでスライムが出現する場所を計算しています。 – user1599078

答えて

2

私がfrom the Java Specificationを移植したJava.Util.RandomのCバージョンです。

最高のことは、Javaプログラムを作成して数値のロードを生成し、このC#バージョンが同じ数を生成することを確認することです。それは乱数を生成する必要があるコードにアクセス可能です。この機能を入れRandom number in long range, is this the way?

::私は@Dypplによってここで提供答えのために行くだろう

public sealed class JavaRng 
{ 
    public JavaRng(long seed) 
    { 
     _seed = (seed^LARGE_PRIME) & ((1L << 48) - 1); 
    } 

    public int NextInt(int n) 
    { 
     if (n <= 0) 
      throw new ArgumentOutOfRangeException("n", n, "n must be positive"); 

     if ((n & -n) == n) // i.e., n is a power of 2 
      return (int)((n * (long)next(31)) >> 31); 

     int bits, val; 

     do 
     { 
      bits = next(31); 
      val = bits % n; 
     } while (bits - val + (n-1) < 0); 
     return val; 
    } 

    private int next(int bits) 
    { 
     _seed = (_seed*LARGE_PRIME + SMALL_PRIME) & ((1L << 48) - 1); 
     return (int) (((uint)_seed) >> (48 - bits)); 
    } 

    private long _seed; 

    private const long LARGE_PRIME = 0x5DEECE66DL; 
    private const long SMALL_PRIME = 0xBL; 
} 
0

long LongRandom(long min, long max, Random rand) 
{ 
    byte[] buf = new byte[8]; 
    rand.NextBytes(buf); 
    long longRand = BitConverter.ToInt64(buf, 0); 
    return (Math.Abs(longRand % (max - min)) + min); 
} 

その後

long r = LongRandom(100000000000000000, 100000000000000050, new Random()); 
+5

LongRandom(long.MinValue、long.MaxValue、new Random())は常に-9223372036854775808を返します。いずれの場合でも、 .Abs()は1ビットを破壊し、63個のランダムビットを残します。63個のランダムビットしか持たない場合、64ビットの乱数は提供できません。 –

関連する問題