我們在做能自動生成試卷的考試系統時常常需要隨機生成一組不重復的題目在net Framework中提供了一個專門用來產生隨機數的類SystemRandom
對於隨機數大家都知道計算機不 可能產生完全隨機的數字所謂的C#隨機數發生器都是通過一定的算法對事先選定的隨機種子做復雜的運算用產生的結果來近似的模擬完全隨機數這種隨機數被稱 作偽隨機數偽隨機數是以相同的概率從一組有限的數字中選取的所選數字並不具有完全的隨機性但是從實用的角度而言其隨機程度已足夠了偽隨機數的選 擇是從隨機種子開始的所以為了保證每次得到的偽隨機數都足夠地隨機隨機種子的選擇就顯得非常重要如果隨機種子一樣那麼同一個C#隨機數發生器產生 的隨機數也會一樣一般地我們使用同系統時間有關的參數作為隨機種子這也是net Framework中的C#隨機數發生器默認采用的方法
我們可以使用兩種方式初始化一個C#隨機數發生器
第一種方法不指定隨機種子系統自動選取當前時間作為隨機種子
Random ro = new Random()
第二種方法可以指定一個int型參數作為隨機種子
int iSeed=
Random ro = new Random()
long tick = DateTimeNowTicks
Random ran = new Random((int)(tick & xffffffffL) | (int) (tick >> ))
用它來檢測生成的隨機數是否有重復如果取出來的數字和已取得的數字有重復就重新隨機獲取
Random ra=new Random(unchecked((int)DateTimeNowTicks))
int[] arrNum=new int[]
int tmp=
int minValue=
int maxValue=
for (int i=i<i++)
{
tmp=raNext(minValuemaxValue) //隨機取數
arrNum=getNum(arrNumtmpminValuemaxValuera) //取出值賦到數組中
}
……
……
public int getNum(int[] arrNumint tmpint minValueint maxValueRandom ra)
{
int n=
while (n<=arrNumLength)
{
if (arrNum[n]==tmp) //利用循環判斷是否有重復
{
tmp=raNext(minValuemaxValue) //重新隨機獲取
getNum(arrNumtmpminValuemaxValuera)//遞歸如果取出來的數字和已取得的數字有重復就重新隨機獲取
}
n++
}
return tmp
}
From:http://tw.wingwit.com/Article/program/net/201311/11332.html