有人可以验证这种方法。我需要两个long范围内的long类型号。我使用.NET Random.Next(min,max)函数,该函数返回int的。如果我简单地将long除以2,生成随机数,最后将其再次乘以2,我的推理是否正确?还是我太热情了...
我知道我的随机分辨率会降低,但是还有其他错误会导致没有这样的随机数。

long min = st.MinimumTime.Ticks;    //long is Signed 64-bit integer
long max = st.MaximumTime.Ticks;
int minInt = (int) (min / 2);      //int is Signed 64-bit integer
int maxInt = (int) (max / 2);      //int is Signed 64-bit integer

Random random = new Random();
int randomInt = random.Next(minInt, maxInt);
long randomLong = (randomInt * 2);

最佳答案

您为什么不只生成两个随机的Int32值,然后从中生成一个Int64

long LongRandom(long min, long max, Random rand) {
    long result = rand.Next((Int32)(min >> 32), (Int32)(max >> 32));
    result = (result << 32);
    result = result | (long)rand.Next((Int32)min, (Int32)max);
    return result;
}

抱歉,我第一次忘记添加边界。添加了minmax参数。您可以像这样测试它:
long r = LongRandom(100000000000000000, 100000000000000050, new Random());
r的值将在所需范围内。

编辑:上面的实现有缺陷。生成4个16位整数而不是2个32位整数以避免符号无符号问题可能是值得的。但是在这一点上,解决方案失去了优雅,因此我认为最好坚持使用Random.NextBytes版本:
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);
}

就值(value)分配而言(从我进行的非常简单的测试来看),它看起来还不错。

关于c#-4.0 - 远程随机数,是这样吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6651554/

10-11 02:45
查看更多