C 隨機數 Random 的使用

2021-05-24 09:14:13 字數 2528 閱讀 2787

摘自:

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

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

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

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

random ro = new random();

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

int iseed=10;

random ro = new random(10);

long tick = datetime.now.ticks;

random ran = new random((int)(tick & 0xffffffffl) | (int) (tick >> 32));

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

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

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

int iresult;

iresult=ro.next();

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

int iresult;

int iup=100;

iresult=ro.next(iup);

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

int iresult;

int iup=100;

int idown=50;

iresult=ro.next(idown,iup);

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

double dresult;

dresult=ro.nextdouble();

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

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

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++)

方法2:利用hashtable。[nextpage]

hashtable hashtable = new hashtable();

random rm = new random();

int rmnum = 10;

for (int i = 0; hashtable.count < rmnum; i++) }

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

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++)

.........

.........

public int getnum(int arrnum,int tmp,int minvalue,int maxvalue,random ra)

n++;

} return tmp;

}

C 隨機數函式Random

有缺陷 rand.nextbytes bytes 生成byte陣列隨機數。rand.next 生成int型別隨機數。rand.next 10 生成0到10之間的隨機數。rand.next 10,999 生成10到999之間的隨機數。using system using system.threadin...

Random生成隨機數

random有兩個常用的建構函式,乙個是無參的,乙個是有參的,先來看一段 及執行結果 public class randomtest for int i 0 i 3 i 執行結果如下 無參執行結果 1692516565 無參執行結果 2111480651 無參執行結果 1485452568 有參執行...

Random隨機數生成

下面 演示使用c 11的random庫進行隨機數的生成 include include using namespace std int main 12 3456 78910 1112 1314 15初始化隨機種子 std mt19937 rng rng.seed std random device ...