如何用C 生成不重複的隨機數

2021-08-24 17:10:31 字數 2323 閱讀 6574

我們在做能自動生成試卷的考試系統時,常常需要隨機生成一組不重複的題目,在.netframework中提供了乙個專門用來產生隨機數的類system.random。

對於隨機數,大家都知道,計算機不可能產生完全隨機的數字,所謂的隨機數發生器都是通過一定的演算法對事先選定的隨機種子做複雜的運算,用產生的結果來近似的模擬完全隨機數,這種隨機數被稱作偽隨機數。偽隨機數是以相同的概率從一組有限的數字中選取的。所選數字並不具有完全的隨機性,但是從實用的角度而言,其隨機程度已足夠了。偽隨機數的選擇是從隨機種子開始的,所以為了保證每次得到的偽隨機數都足夠地「隨機」,隨機種子的選擇就顯得非常重要。如果隨機種子一樣,那麼同乙個隨機數發生器產生的隨機數也會一樣。一般地,我們使用同系統時間有關的引數作為隨機種子,這也是.netframework中的隨機數發生器預設採用的方法。

我們可以使用兩種方式初始化乙個隨機數發生器:

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

randomro=newrandom();

第二種方法可以指定乙個int型引數作為隨機種子:

intiseed=10;

randomro=newrandom(10);

longtick=datetime.now.ticks;

randomran=newrandom((int)(tick&0xffffffffl)|(int)(tick>>32));

這樣可以保證99%不是一樣。

之後,我們就可以使用這個random類的物件來產生隨機數,這時候要用到random.next()方法。這個方法使用相當靈活,你甚至可以指定產生的隨機數的上下限。

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

intiresult;

iresult=ro.next();

下面的**指定返回小於100的隨機數:

intiresult;

intiup=100;

iresult=ro.next(iup);

而下面這段**則指定返回值必須在50-100的範圍之內:

intiresult;

intiup=100;

intidown=50;

iresult=ro.next(idown,iup);

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

doubledresult;

dresult=ro.nextdouble();

但是用random類生成題號,會出現重複,特別是在數量較小的題目中要生成不重複的的題目是很難的,參考了網上的一些方法,包括兩類,一類是通過隨機種子入手,使每一次的隨機種子不同,來保證不重複;第二類是使用一些資料結構和演算法。下面主要就第二類介紹幾個方法。

方法1:思想是用乙個陣列來儲存索引號,先隨機生成乙個陣列位置,然後把這個位置的索引號取出來,並把最後乙個索引號複製到當前的陣列位置,然後使隨機數的上限減一,具體如:先把這100個數放在乙個陣列內,每次隨機取乙個位置(第一次是1-100,第二次是1-99,...),將該位置的數用最後的數代替。

intindex=newint[15];

for(inti=0;i<15;i++)

index=i;

randomr=newrandom();

//用來儲存隨機生成的不重複的10個數

intresult=newint[10];

intsite=15;//設定下限

intid;

for(intj=0;j<10;j++)

方法2:利用hashtable。[nextpage]

hashtablehashtable=newhashtable();

randomrm=newrandom();

intrmnum=10;

for(inti=0;hashtable.count方法3:遞迴,用它來檢測生成的隨機數是否有重複,如果取出來的數字和已取得的數字有重複就重新隨機獲取。

randomra=newrandom(unchecked((int)datetime.now.ticks));

intarrnum=newint[10];

inttmp=0;

intminvalue=1;

intmaxvalue=10;

for(inti=0;i<10;i++)

.........

.........

publicintgetnum(intarrnum,inttmp,intminvalue,intmaxvalue,randomra)

n++;

} returntmp;

}

如何用C 生成不重複的隨機數

我們在做能自動生成試卷的考試系統時,常常需要隨機生成一組不重複的題目,在.net framework中提供了乙個專門用來產生隨機數的類system.random。對於隨機數,大家都知道,計算機不 可能產生完全隨機的數字,所謂的隨機數發生器都是通過一定的演算法對事先選定的隨機種子做複雜的運算,用產生的...

不重複隨機數生成

直接上 生成 0,total 的隨機數 最大隨機數 ilist private static ilistgetrandomsequence int total random random new random for var i listbase.count 1 i 0 i return listo...

C 生成不重複的隨機數

在做洗牌演算法的時候用到了隨機數,並且產生的隨機數中不能有重複的元素,因為是用c語言實現的,就把值賦給陣列,然後用隨機數產生陣列的下標,每產生乙個就刪除對應的元素,然後隨機數的生成範圍減一,但是這樣做每次都要迴圈去移動陣列元素,從時間複雜度上來說這樣並不好。於是,後來用c 重新實現 實現的思路並沒有...