在VB中我現在用的rnd()這個函數都是假隨機有哪位可以告訴我真隨機應該怎么獲取嗎
熱心網友
計算機中隨機數的產生大家可能很多次討論過隨機數在計算機中怎樣產生的問題,在這篇文章中,我會對這個問題進行更深入的探討,闡述我對這個問題的理解。首先需要聲明的是,計算機不會產生絕對隨機的隨機數,計算機只能產生“偽隨機數”。其實絕對隨機的隨機數只是一種理想的隨機數,即使計算機怎樣發展,它也不會產生一串絕對隨機的隨機數。計算機只能生成相對的隨機數,即偽隨機數。偽隨機數并不是假隨機數,這里的“偽”是有規律的意思,就是計算機產生的偽隨機數既是隨機的又是有規律的。怎樣理解呢?產生的偽隨機數有時遵守一定的規律,有時不遵守任何規律;偽隨機數有一部分遵守一定的規律;另一部分不遵守任何規律。比如“世上沒有兩片形狀完全相同的樹葉”,這正是點到了事物的特性,即隨機性,但是每種樹的葉子都有近似的形狀,這正是事物的共性,即規律性。從這個角度講,你大概就會接受這樣的事實了:計算機只能產生偽隨機數而不能產生絕對隨機的隨機數。那么計算機中隨機數是怎樣產生的呢?有人可能會說,隨機數是由“隨機種子”產生的。沒錯,隨機種子是用來產生隨機數的一個數,在計算機中,這樣的一個“隨機種子”是一個無符號整形數。那么隨機種子是從哪里獲得的呢?下面看這樣一個C程序://rand01。c#includestatic unsigned int RAND_SEED;unsigned int random(void){ RAND_SEED=(RAND_SEED*123+59)%65536; return(RAND_SEED);}void random_start(void){ int temp[2]; movedata(0x0040,0x006c,FP_SEG(temp),FP_OFF(temp),4); RAND_SEED=temp[0];}main(){ unsigned int i,n; random_start(); for(i=0;i#include using namespace std;int main(){ unsigned int seed=5; srand(seed); unsigned int r=rand(); cout#include using namespace std;int main(){ srand((unsigned)time(NULL)); unsigned int r=rand(); cout#includeusing namespace std;int main(){ int rNum,m=20; char *ch=new char[m]; for ( int i = 0; i 從 1 到 m 的整數中(偽)隨機取 n 個整數(容許重復):Private Sub Command1_Click()Dim m As Long, n As Long, i As Longm = 10n = 5For i = 1 To nRandomizePrint Int(Rnd * m + 1)Next iEnd Sub 對,沒有真正的隨機,我投“問知識人”一票!! 最簡單的方法就是在程序開頭加入randomize timer也就是從時鐘取一個隨機種子,然后再用rnd(0),可以得到(0,1)之間的隨機單精度數字。 二樓正確,不存在真隨機數,計算機里面的隨機數都是通過某種算法計算出來的,無法實現自然界的真隨機。算法是:首先取一個固定的數作為種子,帶入隨機數生成器,生成第一個隨機數,再用第一個隨機數作為種子,生成第二個隨機數………………。你可以試一下,每次用rand生成的隨機數序列是完全一樣的。一樓說的先使用randomize是拿當時的系統時間做隨機種子,這樣可以保證每次生成的第一個數不一樣,這樣其實就是從前面說的那個隨機數序列里面,從中間的某個由時間決定的隨機位置開始作為第一個隨機數,往后取得隨機數列,可以達到比較隨機。如果你是在一個循環里面取很多個隨機數,每次都用randomize然后再用rnd的話,就可以認為生成的是一個真隨機數列了。 Randomize 語句初始化隨機數生成器。語法Randomize [number]可選的 number 參數是 Variant 或任何有效的數值表達式。說明Randomize 用 number 將 Rnd 函數的隨機數生成器初始化,該隨機數生成器給 number 一個新的種子值。如果省略 number,則用系統計時器返回的值作為新的種子值。如果沒有使用 Randomize,則(無參數的)Rnd 函數使用第一次調用 Rnd 函數的種子值。注意 若想得到重復的隨機數序列,在使用具有數值參數的 Randomize 之前直接調用具有負參數值的 Rnd。使用具有同樣 number 值的 Randomize 是不會得到重復的隨機數序列的。Randomize 語句示例本示例用 Randomize 語句初始化隨機數生成器。由于忽略了數值參數, 所以 Randomize 用 Timer 函數的返回值作為新的隨機數種子值。Dim MyValueRandomize ' 對隨機數生成器做初始化的動作。MyValue = Int((6 * Rnd) + 1) ' 生成 1 到 6 之間的隨機數值。Rnd 函數 返回一個包含隨機數值的 Single。語法Rnd[(number)]可選的 number 參數是 Single 或任何有效的數值表達式。返回值如果 number 的值是 Rnd 生成 小于 0 每次都使用 number 作為隨機數種子得到的相同結果。 大于 0 序列中的下一個隨機數。 等于 0 最近生成的數。 省略 序列中的下一個隨機數。 說明Rnd 函數返回小于 1 但大于或等于 0 的值。number 的值決定了 Rnd 生成隨機數的方式。對最初給定的種子都會生成相同的數列,因為每一次調用 Rnd 函數都用數列中的前一個數作為下一個數的種子。在調用 Rnd 之前,先使用無參數的 Randomize 語句初始化隨機數生成器,該生成器具有根據系統計時器得到的種子。為了生成某個范圍內的隨機整數,可使用以下公式:Int((upperbound - lowerbound + 1) * Rnd + lowerbound)這里,upperbound 是隨機數范圍的上限,而 lowerbound 則是隨機數范圍的下限。注意 若想得到重復的隨機數序列,在使用具有數值參數的 Randomize 之前直接調用具有負參數值的 Rnd。使用具有同樣 number 值的 Randomize 是不會得到重復的隨機數序列的。種子為初始值,用來生成偽隨機數字。例如, Randomize 語句創建一種子值供 Rnd 函數使用,以接著創建唯一偽隨機數列。以上摘自MSDN關于RND函數和Randomize 語句的解釋,其中只談及偽隨機數,你所說真隨機數未找到出處,供參考。 不隨在真隨機數 完畢 在form_load中加入randomize()就真隨機了嘛熱心網友
熱心網友
熱心網友
熱心網友
熱心網友
熱心網友
熱心網友