您的位置:首页 > 其它

产生一组少重复的随机数

2015-06-19 22:40 274 查看
最近在开发项目的过程中,需要产生一些随机数,如果我们简单的用C#中的Random.Next方法,很难产生一组少重复的随机数(当然是伪随机数),在网上也看了很多方法,貌似也不可行,或者比较复杂。于是,参考网上的一些方法,自己写了两个个产生一组伪随机数的方法。

方法一的代码如下:

[c-sharp] view plaincopy

List<int> GenerateRandom(int iMax, int iNum)

{

List<int> lstRet = new List<int>();

for (int i = 0; i < iNum; i++)

{

long lTick = DateTime.Now.Ticks;

Random ran = new Random((int)lTick * i);

int iTmp = ran.Next(iMax);

lstRet.Add(iTmp);

}

return lstRet;

}

其中,iMax表示最大范围,iNum是产生的随机数个数。

利用这种方法,得到了一组范围(0...iMax)之间的伪随机数,很少有重复的数据,这种方法得到的是一个有某种规律的随机数序列。

分析其中的原因,其实是因为每次植入的种子不一样,主要是因为 i 的变化,在.Net平台,ticks数在一段时间内其实是一个定值,因此,虽然这种方法得到了一组随机数,但是可能得到的数据之间有某种规律。

方法二的代码如下:

[c-sharp] view plaincopy

List<int> GenerateRandom(int iMax, int iNum)

{

long lTick = DateTime.Now.Ticks;

List<int> lstRet = new List<int>();

for (int i = 0; i < iNum; i++)

{

Random ran = new Random((int)lTick * i);

int iTmp = ran.Next(iMax);

lstRet.Add(iTmp);

lTick += (new Random((int)lTick).Next(978))

}

return lstRet;

}

第二种方法也变换了种子,倒数第三行的Next方法中可以输入任意大小的参数。这种方法得到的随机数相比方法一要更好一些。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: