您无需阅读源代码.该公式是单线程,在文档中给出java.util.Random.
这是部分翻译:
[Serializable]
public class Random
{
public Random(UInt64 seed)
{
this.seed = (seed ^ 0x5DEECE66DUL) & ((1UL << 48) - 1);
}
public int NextInt(int n)
{
if (n <= 0) throw new ArgumentException("n must be positive");
if ((n & -n) == n) // i.e., n is a power of 2
return (int)((n * (long)Next(31)) >> 31);
long bits, val;
do
{
bits = Next(31);
val = bits % (UInt32) n;
}
while (bits - val + (n - 1) < 0);
return (int) val;
}
protected UInt32 Next(int bits)
{
seed = (seed * 0x5DEECE66DL + 0xBL) & ((1L << 48) - 1);
return (UInt32)(seed >> (48 - bits));
}
private UInt64 seed;
}
Run Code Online (Sandbox Code Playgroud)
例:
Random rnd = new Random(42);
Console.WriteLine(rnd.NextInt(10));
Console.WriteLine(rnd.NextInt(20));
Console.WriteLine(rnd.NextInt(30));
Console.WriteLine(rnd.NextInt(40));
Console.WriteLine(rnd.NextInt(50));
Run Code Online (Sandbox Code Playgroud)
两个平台上的输出都是0, 3, 18, 4, 20.
如果您拥有java.util.RandomJava实现的类的源代码,则可以轻松地将其移植到.NET.
如果您需要两个应用程序(Java和.NET)使用某个随机数生成器,您最好在两个平台中实现一个并使用它,因为系统提供的版本可能会因更新而改变其行为.(看起来Java规范精确地描述了其PRNG的行为.)
| 归档时间: |
|
| 查看次数: |
2175 次 |
| 最近记录: |