C# Random(Long)

本文关键字:Long Random | 更新日期: 2023-09-27 18:04:26

我试图在c#中生成一个基于种子的数字。唯一的问题是种子太大,不可能是int32。有没有办法让我用长如种子的?

是的,种子必须是一个长。

C# Random(Long)

这是我从Java规范移植的Java.Util.Random的c#版本。

最好的方法是编写一个Java程序来生成一堆数字,并检查这个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;
}

对于今天看到这个问题的人来说,. net 6和更高版本提供了Random。NextInt64,它有以下重载:

  • NextInt64()

    • 返回非负随机整数。
  • NextInt64(Int64)

    • 返回一个小于指定最大值的非负随机整数。
  • NextInt64(Int64, Int64)

    • 返回指定范围内的随机整数。

我会选择@Dyppl在这里提供的答案:长程随机数,是这样吗?

把这个函数放在需要生成随机数的代码可以访问的地方:

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