c#生成随机数
最近写东西需要在题库中随机选20道题,
这种需求当然要用到随机数,所以就在网上复制了一段代码下来,代码很精炼,用的也不错
附上链接表示感谢
Random ra=new Random(unchecked((int)DateTime.Now.Ticks));
int[] arrNum=new int[10];
int tmp=0;
int minValue=1;
int maxValue=10;
for (int i=0;i<10;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=0;
while (n<=arrNum.Length-1)
{
if (arrNum[n]==tmp) //利用循环判断是否有重复
{
tmp=ra.Next(minValue,maxValue); //重新随机获取。
getNum(arrNum,tmp,minValue,maxValue,ra);//递归:如果取出来的数字和已取得的数字有重复就重新随机获取。
}
n++;
}
return tmp;
}
因为只抽了20道,所以一直没出问题,直到我把20改的很大,堆栈溢出了,
才发现在我的程序中用递归确实是一件很危险的事情,
于是又百度到了另一个人的代码
再次附上链接表示感谢
http://www.cnblogs.com/huangfr/archive/2012/03/27/2420464.html
int[] index = new int[15];
for (int i = 0; i < 15; i++)
index = i;
Random r = new Random();
//用来保存随机生成的不重复的10个数
int[] result = new int[10];
int site = 15;//设置上限
int id;
for (int j = 0; j < 10; j++)
{
id = r.Next(1, site - 1);
//在随机位置取出一个数,保存到结果数组
result[j] = index[id];
//最后一个数复制到当前位置
index[id] = index[site - 1];
//位置的上限减少一
site--;
}
我只想说:
一段好的代码足以拯救一个菜鸟程序的无数头发和时间