浅谈C#随机数发生器
2024-08-23 03:47:01
我们在做能自动生成试卷的考试系统时,常常需要随机生成一组不重复的题目,在.net Framework中提供了一个专门用来产生随机数的类System.Random。
对于随机数,大家都知道,计算机不 可能产生完全随机的数字,所谓的C#随机数发生器都是通过一定的算法对事先选定的随机种子做复杂的运算,用产生的结果来近似的模拟完全随机数,这种随机数被称 作伪随机数。伪随机数是以相同的概率从一组有限的数字中选取的。所选数字并不具有完全的随机性,但是从实用的角度而言,其随机程度已足够了。伪随机数的选 择是从随机种子开始的,所以为了保证每次得到的伪随机数都足够地“随机”,随机种子的选择就显得非常重要。如果随机种子一样,那么同一个C#随机数发生器产生 的随机数也会一样。一般地,我们使用同系统时间有关的参数作为随机种子,这也是.net Framework中的C#随机数发生器默认采用的方法。
我们可以使用两种方式初始化一个C#随机数发生器:
第一种方法不指定随机种子,系统自动选取当前时间作为随机种子:
Random ro = new Random();
第二种方法可以指定一个int型参数作为随机种子:
int iSeed=;
Random ro = new Random();
long tick = DateTime.Now.Ticks;
Random ran = new Random((int)(tick & 0xffffffffL) | (int) (tick >> ));
用它来检测生成的随机数是否有重复,如果取出来的数字和已取得的数字有重复就重新随机获取。
Random ra=new Random(unchecked((int)DateTime.Now.Ticks));
int[] arrNum=new int[];
int tmp=;
int minValue=;
int maxValue=;
for (int i=;i<;i++)
{
tmp=ra.Next(minValue,maxValue); //随机取数
arrNum=getNum(arrNum,tmp,minValue,maxValue,ra); //取出值赋到数组中
}
.........
.........
public int getNum(int[] arrNum,int tmp,int minValue,int maxValue,Random ra)
{
int n=;
while (n<=arrNum.Length-)
{
if (arrNum[n]==tmp) //利用循环判断是否有重复
{
tmp=ra.Next(minValue,maxValue); //重新随机获取。
getNum(arrNum,tmp,minValue,maxValue,ra);//递归:如果取出来的数字和已取得的数字有重复就重新随机获取。
}
n++;
}
return tmp;
}
最新文章
- Nuget 命令 NuGet 管理项目库
- spring+redis 集群下的操作
- 怎样用SQL语句查询一个数据库中的所有表?
- 9月9日HTML上午表单元素2(框架、样式表)
- DevExpress使用教程合集
- 【php】assert函数的用法
- HDU 3076:ssworld VS DDD(概率DP)
- 编译gd-2.0.35.tar.gz时报错:gd_png.c:16:53: error: png.h: No such file or directory
- easyui常用控件及样式收藏
- 读懂IL代码(二)
- 【Xamarin挖墙脚系列:常用的Mac 命令】
- Uva 225 Golygons
- DHTML【3】--HTML
- FZU Problem 2150 Fire Game(bfs)
- spring中WebApplicationContextUtils类说明
- centos7安装libgdiplus。netcore生成验证码,处理图片
- Android运行时权限
- java并发中的Semaphore
- mybatis mapper接口开发dao层
- Codeforces Round #292 (Div. 1)A. Drazil and Factorial 构造