C說話/C++若何生成隨機數。本站提示廣大學習愛好者:(C說話/C++若何生成隨機數)文章只能為提供參考,不一定能成為您想要的結果。以下是C說話/C++若何生成隨機數正文
本文分享了C說話/C++若何生成隨機數的詳細完成辦法,供年夜家參考,詳細內容以下
C說話/C++如何發生隨機數:這裡要用到的是rand()函數, srand()函數,C說話/C++裡沒有自帶的random(int number)函數。
(1) 假如你只需發生隨機數而不須要設定規模的話,你只需用rand()便可以了:rand()會前往一隨機數值, 規模在0至RAND_MAX 間。RAND_MAX界說在stdlib.h, 其值為2147483647。
例如:
#include<stdio.h> #include<stdlib.h> void main() { for(int i=0;i<10;i+) printf("%d\n",rand()); }
(2) 假如你要隨機生成一個在必定規模的數,你可以在宏界說中界說一個random(int number)函數,然後在main()外面直接挪用random()函數:
例如:隨機生成10個0~100的數:
#include<stdio.h> #include<stdlib.h> #define random(x) (rand()%x) void main() { for(int x=0;x<10;x++) printf("%d\n",random(100)); }
(3)然則下面兩個例子所生成的隨機數都只能是 一次性的,假如你第二次運轉的時刻輸入成果仍和第一次一樣。這與srand()函數有關。srand()用來設置rand()發生隨機數時的隨機數種子。 在挪用rand()函數發生隨機數前,必需先應用srand()設好隨機數種子(seed), 假如未設隨機數種子, rand()在挪用時會主動設隨機數種子為1。下面的兩個例子就是由於沒有設置隨機數種子,每次隨機數種子都主動設成雷同值1 ,進而招致rand()所發生的隨機數值都一樣。
srand()函數界說 : void srand (unsigned int seed);
平日可以應用geypid()或time(0)的前往值來當作seed
假如你用time(0)的話,要參加頭文件#include<time.h>
例如:
#include<stdio.h> #include<stdlib.h> #include<time.h> #define random(x) (rand()%x) void main() { srand((int)time(0)); for(int x=0;x<10;x++) printf("%d\n",random(100)); }
隨機數在現實應用中異常之多,如游戲設計,旌旗燈號處置,平日我們很輕易獲得均勻散布的隨機數。但若何依據均勻散布的隨機數進而發生其它散布的隨機數呢?本文提出了一種基於幾何直不雅面積的辦法,以正態散布隨機數的發生為例評論辯論了隨意率性散布的隨機數的發生辦法。
1、均勻散布隨機數的發生
年夜家都曉得,隨機數在各個方面都有很年夜的感化,在vc的情況下,為我們供給了庫函數rand()來發生一個隨機的整數。該隨機數是均勻在0~RAND_MAX之間均勻散布的,RAND_MAX是一個常量,在VC6.0情況下是如許界說的:
#define RAND_MAX 0x7fff
它是一個short 型數據的最年夜值,假如要發生一個浮點型的隨機數,可以將rand()/1000.0如許就獲得一個0~32.767之間均勻散布的隨機浮點數。假如要使得 規模年夜一點,那末可以經由過程發生幾個隨機數的線性組合來完成隨意率性規模內的均勻散布的隨機數。例如要發生-1000~1000之間的精度為四位小數的均勻散布 的隨機數可以如許來完成。先發生一個0到10000之間的隨機整數。辦法以下 :
int a = rand()000;
然後保存四位小數發生0~1之間的隨機小數:
double b = (double)a/10000.0;
然後經由過程線性組合便可以完成隨意率性規模內的隨機數的發生,要完成-1000~1000內的均勻散布的隨機數可以如許做:
double dValue = (rand()000)/10000.0*1000-(rand()000)/10000.0*1000;
則dValue就是所要的值。
到如今為止,你也許認為一切任務都曾經完成了,其實否則,細心一看,你會發明有成績的,下面的式子化簡後就變成:
double dValue = (rand()000)/10.0-(rand()000)/10.0;
如許一來,發生的隨機數規模是准確的,然則精度不准確了,釀成了只要一名准確的小數的隨機數了,前面三位的小數都是零,明顯不是我們請求的,甚麼緣由呢,又怎樣辦呢。
先找緣由,rand()發生的隨機數分辯率為32767,兩個就是65534,而經由求余後分辯度還要減小為10000,兩個就是20000而請求的分辯率為1000*10000*2=20000000,明顯遠遠不敷。上面供給的辦法可以完成准確的成果:
double a = (rand()000) * (rand()00)/10000.0; double b = (rand()000) * (rand()00)/10000.0; double dValue = a-b;
則dValue就是所請求的成果。鄙人面的函數中可以完成發生一個在一個區間以內的均勻散布的隨機數,精度是4位小數。
double AverageRandom(double min,double max) { int minInteger = (int)(min*10000); int maxInteger = (int)(max*10000); int randInteger = rand()*rand(); int diffInteger = maxInteger - minInteger; int resultInteger = randInteger % diffInteger + minInteger; return resultInteger/10000.0; }
然則有一個值得留意的成績,隨機數的發生須要有一個隨機的種子,由於用盤算機發生的隨機數是經由過程遞推的辦法得來的,必需有一個初始值,也就是平日所說的隨 機種子,假如纰謬隨機種子停止初始化,那末盤算機有一個確省的隨機種子,如許每次遞推的成果就完整雷同了,是以須要在每次法式運轉時對隨機種子停止初始 化,在vc中的辦法是挪用srand(int)這個函數,其參數就是隨機種子,然則假如給一個常量,則獲得的隨機序列就完整雷同了,是以可使用體系的時 間來作為隨機種子,由於體系時光可以包管它的隨機性。
挪用辦法是srand(GetTickCount()),然則又不克不及在每次挪用rand()的時刻都用srand(GetTickCount())來初始 化,由於如今盤算機運轉時光比擬快,當持續挪用rand()時,體系的時光還沒有更新,所以獲得的隨機種子在一段時光內是完整雷同的,是以普通只在停止一 次年夜批隨機數發生之進步行一次隨機種子的初始化。上面的代碼發生了400個在-1~1之間的均勻散布的隨機數。
double dValue[400]; srand(GetTickCount()); for(int i= 0;i < 400; i++) { double dValue[i] = AverageRandom(-1,1); }
以上就是本文的全體內容,願望對年夜家的進修有所贊助。