天天看點

用C#生成不重複的随機數

對于随機數,大家都知道,計算機不可能産生完全随機的數字,所謂的随機數發生器都是通過一定的算法對事先標明的随機種子做複雜的運算,用産生的結果來近似的模拟完全随機數,這種随機數被稱 作僞随機數。僞随機數是以相同的機率從一組有限的數字中選取的。所選數字并不具有完全的随機性,但是從實用的角度而言,其随機程度已足夠了。僞随機數的選 擇是從随機種子開始的,是以為了保證每次得到的僞随機數都足夠地“随機”,随機種子的選擇就顯得非常重要。如果随機種子一樣,那麼同一個随機數發生器産生 的随機數也會一樣。一般地,我們使用同系統時間有關的參數作為随機種子,這也是.net

framework中的随機數發生器預設采用的方法。   我們可以使用兩種方式初始化一個随機數發生器:

  第一種方法不指定随機種子,系統自動選取目前時間作為随機種子:

  第二種方法可以指定一個int型參數作為随機種子:

  這樣可以保證99%不是一樣。   之後,我們就可以使用這個random類的對象來産生随機數,這時候要用到<code>random.next()</code>方法。這個方法使用相當靈活,你甚至可以指定産生的随機數的上下限。

  不指定上下限的使用如下:

  下面的代碼指定傳回小于100的随機數:

  而下面這段代碼則指定傳回值必須在50-100的範圍之内:

  除了random.next()方法之外,random類還提供了random.nextdouble()方法産生一個範圍在0.0-1.0之間的随機的雙精度浮點數:

  但是用random類生成題号,會出現重複,特别是在數量較小的題目中要生成不重複的的題目是很難的,參考了網上的一些方法,包括兩類,一類是通過随機種子入手,使每一次的随機種子不同,來保證不重複;第二類是使用一些資料結構和算法。下面主要就第二類介紹幾個方法。     方法1:思想是用一個數組來儲存索引号,先随機生成一個數組位置,然後把這個位置的索引号取出來,并把最後一個索引号複制到目前的數組位置,然後使随機 數的上限減一,具體如:先把這100個數放在一個數組内,每次随機取一個位置(第一次是1-100,第二次是1-99,…),将該位置的數用最後的數

代替。

 方法2:利用hashtable。[nextpage]

  方法3:遞歸,用它來檢測生成的随機數是否有重複,如果取出來的數字和已取得的數字有重複就重新随機擷取。

繼續閱讀