产生一组少重复的随机数
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方法中可以输入任意大小的参数。这种方法得到的随机数相比方法一要更好一些。
方法一的代码如下:
[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方法中可以输入任意大小的参数。这种方法得到的随机数相比方法一要更好一些。
相关文章推荐
- 【译】使用 Python 编写虚拟机解释器
- Theano2.1.17-基础知识之剖析theano的函数
- 欢迎使用CSDN-markdown编辑器
- delphi XE8 Android 中使用 MessageDlg 范例
- 被唤起的睡梦
- 【译】使用 Python 编写虚拟机解释器
- HTTP协议详解(真的很经典)
- Mac环境下搭建Hadoop开发框架
- 使用EF codeFirst创建数据库
- 用宏定义封装LoadLibrary,方便的动态加载dll
- HTTP协议详解
- kerberos+ladp+hadoop-ha 安全认证部署配置
- java.util.concurrent 用法实例详解
- 实现Web安全登录
- [Swust OJ 643]--行列式的计算(上三角行列式变换)
- hadoop-ha QJM架构应用故障总结
- 一名普通的电脑技术员的蓝光历程
- NA心得
- 网络攻击常用手段
- 文件系统(四)--pipe.c read_write.c stat.c fcntl.c ioctl.c源码分析