我正在尝试基于C#中的种子生成一个数字。唯一的问题是,种子太大了,无法作为int32。有没有办法可以使用long作为种子?
是的,种子必须是long。
我正在尝试基于C#中的种子生成一个数字。唯一的问题是,种子太大了,无法作为int32。有没有办法可以使用long作为种子?
是的,种子必须是long。
Java.Util.Random
的 C# 版本。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;
}
NextInt64()
NextInt64(Int64)
NextInt64(Int64, Int64)
Random
实例。 - Lucaslong 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());
Random
实例。 - Lucas
java.lang.Random
的源代码,然后将其转换为C#;这可能不是太难。算法在这里:http://docs.oracle.com/javase/6/docs/api/java/util/Random.html#next%28int%29 - Matthew Watson