随机long(Random long/NextLong)

 

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

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

ContractedBlock.gif ExpandedBlockStart.gif Random 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.gif ExpandedBlockStart.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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值