rand演算法
⑴ rand函數的用法
srand((unsigned)time(NULL))則使用系統定時/計數器的值作為隨機種子。每個種子對應一組根據演算法預先生成的隨機數,所以,在相同的平台環境下,不同時間產生的隨機數會是不同的,相應的,若將srand(unsigned)time(NULL)改為srand(TP)(TP為任一常量),則無論何時運行、運行多少次得到的「隨機數」都會是一組固定的序列,因此srand生成的隨機數是偽隨機數。
庫函數中系統提供了兩個函數用於產生隨機數:srand()和rand()。 原型為:
函數一:int rand(void);
返回一個[0,RAND_MAX]間的隨機整數。
函數二:void srand(unsigned seed);
參數seed是rand()的種子,用來初始化rand()的起始值。
但是,要注意的是所謂的「偽隨機數」指的並不是假的隨機數。其實絕對的隨機數只是一種理想狀態的隨機數,計算機只能生成相對的隨機數即偽隨機數。計算機生 成的偽隨機數既是隨機的又是有規律的 —— 一部份遵守一定的規律,一部份則不遵守任何規律。比如「世上沒有兩片形狀完全相同的樹葉」,這體現到了事物的特性 —— 差異性;但是每種樹的葉子都有近似的形狀,這正是事物的共性 —— 規律性。從這個角度講,我們就可以接受這樣的事實了:計算機只能產生偽隨機數而不是絕對的隨機數。
⑵ 基本演算法語句 rand 的意思..這是什麼命令哎..
rand是一個偽隨機函數
rand函數產生rand產生的是0到1(不包括1)的偽隨機數
但是,要注意的是所謂的「偽隨機數」指的並不是假的隨機數。其實絕對的隨機數只是一種理想狀態的隨機數,計算機只能生成相對的隨機數即偽隨機數。計算機生 成的偽隨機數既是隨機的又是有規律的 —— 一部份遵守一定的規律,一部份則不遵守任何規律。比如「世上沒有兩片形狀完全相同的樹葉」,這正點到了事物的特性 —— 規律性;但是每種樹的葉子都有近似的形狀,這正是事物的共性 —— 規律性。從這個角度講,我們就可以接受這樣的事實了:計算機只能產生偽隨機數而不是絕對的隨機數。
系統在調用rand()之前都會自動調用srand(),如果用戶在rand()之前曾調用過srand()給參數seed指定了一個值,那麼 rand()就會將seed的值作為產生偽隨機數的初始值;而如果用戶在rand()前沒有調用過srand(),那麼系統默認將1作為偽隨機數的初始 值。如果給了一個定值,那麼每次rand()產生的隨機數序列都是一樣的~~
所以為了避免上述情況的發生我們通常用srand((unsigned)time(0))或者srand((unsigned)time(NULL))來 產生種子。如果仍然覺得時間間隔太小,可以在(unsigned)time(0)或者(unsigned)time(NULL)後面乘上某個合適的整數。 例如,srand((unsigned)time(NULL)*10)
另外,關於time_t time(0):time_t被定義為長整型,它返回從1970年1月1日零時零分零秒到目前為止所經過的時間,單位為秒。
關於求值區域的問題:要取得[a,b)之間的隨機整數,使用(rand() % (b-a))+ a (結果值將含a不含b)。
在a為0的情況下,簡寫為rand() % b。
⑶ 挑戰演算法可以用rand產生隨機數嗎
我看了下網上,是這樣的:rand()隨機產生一個數(0-65535),加上%後,就是對其它數求余,求余產生的數取決於求余的數。
比如,rand()%20;
意思是利用rand()的返回值(一個0-65535之間的數)對20求余,求余的結果就是0-19。也就是0~(20-1)之間。
如果我們要產生10~20之間的隨機數,可以rand()%((20-10)+1)+10
含義是,20-10是產生0~9,((20-10)+1)是產生0~10,在這個基礎上。再加10,就是10~20
⑷ random 和 rand 演算法一樣嗎
不一樣,看下面具體比較!
Random(int n)函數與rand()函數的比較
1、 Random(int n):randomize,random 不是ANSI C標准,random函數不能在GCC,VC等編譯器下編譯通過
2、 Rand()函數則可以通過GCC,VC等編譯器
3、 無論 Random(int n)函數或rand()函數要想隨機產生數,都要設置一個種子,否則產生的隨機數均是相同的。
4、 設置種子可以用:srand(int)函數來,同時要結合時間函數,使得每次種子不相同,即可產生不同的隨機數,因此要引入頭文件:#include<time.h>
下面舉個例子:在編寫俄羅斯方塊代碼中,要選擇不同的圖形,實現的代碼如下: #include<stdio.h> #include<stdlib.h> #include<time.h> main()
{ int aa1[4][4]={{0,1,0,0},{0,1,0,0},{0,1,0,0},{0,1,0,0}}; int aa2[4][4]={{0,0,0,0},{0,0,1,1},{0,1,1,0},{0,0,0,0}}; int aa3[4][4]={{0,0,0,0},{0,1,1,0},{1,1,0,0},{0,0,0,0}}; int aa4[4][4]={{0,1,0,0},{0,1,0,0},{0,1,0,0},{1,1,0,0}}; int aa5[4][4]={{0,1,0,0},{0,1,0,0},{0,1,0,0},{0,1,1,0}}; int aa6[4][4]={{0,0,0,0},{0,1,1,0},{0,1,1,0},{0,0,0,0}}; int aa[6]={0,1,2,3,4,5}; int a,i,j;
srand((unsigned)time(0)); a=rand()%5;
⑸ rand函數是怎麼算的
就是均勻分布的隨機數,即0與1之間的數,產生每一個的概率都相同,也就是普通的隨機產生0,1之間的數。
而randn是產生符合正態分布的隨機數,就是靠中間的多,太大、太小的少的0,1之間的隨機數。
⑹ c++的rand函數
你要知道srand和rand配合產生的隨機數是偽隨機數,它們不是真的隨機數,它們有一個種子的概念,如果你知道了種子且知道srand和rand的演算法實現的話,那麼rand產生的隨機數是可以推算出來的。其實如果種子一樣,後面產生的隨機數都是一樣的,這就是你的困惑,我猜你可能是每一次循環中都給srand傳遞了NULL,其實也就是每次都把種子設置為了0,每一次都用相同的值刷新了一下種子,然後只取了第一個「隨機數」,由於初值和演算法都是相同的,那麼其後產生的「隨機數」也就是相同的。
如果想要真隨機數,可以了解一下C++11的std::random_devic。
⑺ rand()%30是什麼意思
編程語言中rand()表示產生一個隨機整數,%30將隨機數限制在[0,30),%10表示只取0-9這10個自然數。以python為例,random.randint(0,30)產生0-30的自然數:
參考資料:
python官方api文檔