gpt4 book ai didi

c#-4.0 - 长范围的随机数,是这样的吗?

转载 作者:行者123 更新时间:2023-12-02 12:03:25 26 4
gpt4 key购买 nike

有人可以验证这个方法吗?我需要一个在两个 long 范围内的 long 类型数字。我使用返回 int 的 .NET Random.Next(min, max) 函数。如果我简单地将 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com