2013-03-17 11 views
5

Ich versuche, eine Zahl basierend auf einem Seed in C# zu generieren. Das einzige Problem ist, dass der Seed zu groß ist, um ein Int32 zu sein. Gibt es eine Möglichkeit, die ich als Samen verwenden kann?C# Zufällig (Long)

Und ja, die Samen müssen lange sein.

+0

wagen zu erklären, warum Samen * müssen * sein 'long'? :) Es sieht so aus als ob du versuchst etwas falsch zu machen. – J0HN

+0

Warum brauchen Sie einen langen Samen für eine Pseudozufallszahl? – tomsv

+0

@ J0HN Ich berechne, wo Schleim in Minecraft spawnt. – user1599078

Antwort

2

Hier ist eine C# -Version von Java.Util.Random, die ich portierte from the Java Specification.

Die beste Sache zu tun ist, ein Java-Programm zu schreiben, um eine Ladung von Zahlen zu erzeugen und zu überprüfen, dass diese C# -Version die gleichen Zahlen erzeugt.

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

ich für die Antwort hier durch @Dyppl bereitgestellt gehen würde: Random number in long range, is this the way?

diese Funktion Setzen Sie, wo es auf den Code zugänglich ist, der die Zufallszahl zu erzeugen, benötigt:

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); 
} 

Dann rufen Sie die Funktion wie folgt aus:

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

Pro Kommentare in Verbindung (und testet mich selbst), funktioniert diese Methode nicht: "Funktioniert nicht richtig. LongRandom (long.MinValue, long.MaxValue, neue Random()), immer zurück-9223372036854775808. In jedem Fall Math .Abs() zerstört ein Bit und lässt 63 zufällige Bits übrig. Wenn Sie nur 63 zufällige Bits haben, können Sie keine 64-Bit-Zufallszahl bereitstellen. " –

Verwandte Themen