淺談C#隨機數(shù)發(fā)生器
我們在做能自動生成試卷的考試系統(tǒng)時,常常需要隨機生成一組不重復的題目,在.net Framework中提供了一個專門用來產(chǎn)生隨機數(shù)的類System.Random。
對于隨機數(shù),大家都知道,計算機不 可能產(chǎn)生完全隨機的數(shù)字,所謂的C#隨機數(shù)發(fā)生器都是通過一定的算法對事先選定的隨機種子做復雜的運算,用產(chǎn)生的結果來近似的模擬完全隨機數(shù),這種隨機數(shù)被稱 作偽隨機數(shù)。偽隨機數(shù)是以相同的概率從一組有限的數(shù)字中選取的。所選數(shù)字并不具有完全的隨機性,但是從實用的角度而言,其隨機程度已足夠了。偽隨機數(shù)的選 擇是從隨機種子開始的,所以為了保證每次得到的偽隨機數(shù)都足夠地“隨機”,隨機種子的選擇就顯得非常重要。如果隨機種子一樣,那么同一個C#隨機數(shù)發(fā)生器產(chǎn)生 的隨機數(shù)也會一樣。一般地,我們使用同系統(tǒng)時間有關的參數(shù)作為隨機種子,這也是.net Framework中的C#隨機數(shù)發(fā)生器默認采用的方法。
我們可以使用兩種方式初始化一個C#隨機數(shù)發(fā)生器:
***種方法不指定隨機種子,系統(tǒng)自動選取當前時間作為隨機種子:
- Random ro = new Random();
第二種方法可以指定一個int型參數(shù)作為隨機種子:
- int iSeed=10;
- Random ro = new Random(10);
- long tick = DateTime.Now.Ticks;
- Random ran = new Random((int)(tick & 0xffffffffL) | (int) (tick >> 32));
用它來檢測生成的隨機數(shù)是否有重復,如果取出來的數(shù)字和已取得的數(shù)字有重復就重新隨機獲取。
- 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); //隨機取數(shù)
- arrNum=getNum(arrNum,tmp,minValue,maxValue,ra); //取出值賦到數(shù)組中
- }
- .........
- .........
- 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) //利用循環(huán)判斷是否有重復
- {
- tmp=ra.Next(minValue,maxValue); //重新隨機獲取。
- getNum(arrNum,tmp,minValue,maxValue,ra);//遞歸:如果取出來的數(shù)字和已取得的數(shù)字有重復就重新隨機獲取。
- }
- n++;
- }
- return tmp;
- }
【編輯推薦】