随机long(Random long/NextLong)

本文介绍在.NET Framework中如何使用Random类生成long类型随机数的方法,包括使用NextDouble和改进后的NextLong方法,后者通过处理long类型的高位和低位部分确保了更大范围内的随机数均匀分布。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

 在.net FCL中random没有生成long类型的随机数,不过random可以生成0-1的随机数,这就可以帮助实现random Long.

如下为一简单实现(.net 3.5):

ContractedBlock.gifExpandedBlockStart.gifRandom NextLong
 1     static class Common
 2     {
 3         public static long NextLong(this Random random,long minValue,long maxValue)
 4         {
 5             if (minValue > maxValue)
 6             {
 7                 throw new ArgumentException("minValue is great than maxValue""minValue");
 8             }
 9             long num = maxValue - minValue;
10             return minValue + (long) (random.NextDouble() * num);
11         }
12     }

 使用如下:

 

1 Random random = new Random();
2 random.NextLong(MinSize, MaxSize);

 

由于random.NextDouble() 是根据Int32来生成的,其个数为Int32.Max个。如果上述NextLong连续调用maxValue-minValue+1次,在maxValue-minValue+1 > Int32.Max时,未必能生成所有可能近视分布均匀的随机数据。

 

现 更新如下:

ContractedBlock.gifExpandedBlockStart.gif代码
public static long NextLong(this Random random, long min, long max)
{
byte[] minArr
= BitConverter.GetBytes(min);
int hMin
= BitConverter.ToInt32(minArr, 4);
int lMin
= BitConverter.ToInt32(new byte[] { minArr[0], minArr[1], minArr[2], minArr[3] }, 0);

byte[] maxArr
= BitConverter.GetBytes(max);
int hMax
= BitConverter.ToInt32(maxArr, 4);
int lMax
= BitConverter.ToInt32(new byte[] { maxArr[0], maxArr[1], maxArr[2], maxArr[3] }, 0);

if (random == null)
{
random
= new Random();
}

int h
= random.Next(hMin, hMax);
int l
= 0;
if (h == hMin)
{
l
= random.Next(Math.Min(lMin, lMax), Math.Max(lMin, lMax));
}
else
{
l
= random.Next(0, Int32.MaxValue);
}

byte[] lArr
= BitConverter.GetBytes(l);
byte[] hArr
= BitConverter.GetBytes(h);
byte[] result
= new byte[8];

for (int i = 0; i < lArr.Length; i++)
{
result[i]
= lArr[i];
result[i
+ 4] = hArr[i];
}
return BitConverter.ToInt64(result, 0);
}

 

 

 

转载于:https://www.cnblogs.com/zzj8704/archive/2010/06/21/1757420.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值