本文目錄一覽:
- 1、C語言中各種函數的具體作用,要詳細點的
- 2、C語言函數的特點及其定義?
- 3、如何用C語言生成一個正態分布的樣本
- 4、我需要c語言每個頭文件里的所有函數介紹及用法!
- 5、怎麼調用c語言中的標準正態分布函數?
- 6、請問:C語言中怎麼計算正態分布函數?
C語言中各種函數的具體作用,要詳細點的
字符處理函數
本類別函數用於對單個字符進行處理,包括字符的類別測試和字符的大小寫轉換
頭文件 ctype.h
函數列表
函數類別 函數用途 詳細說明
字符測試 是否字母和數字 isalnum
是否字母 isalpha
是否控制字符 iscntrl
是否數字 isdigit
是否可顯示字符(除空格外) isgraph
是否可顯示字符(包括空格) isprint
是否既不是空格,又不是字母和數字的可顯示字符 ispunct
是否空格 isspace
是否大寫字母 isupper
是否16進制數字(0-9,A-F)字符 isxdigit
字符大小寫轉換函數 轉換為大寫字母 toupper
轉換為小寫字母 tolower
地區化
本類別的函數用於處理不同國家的語言差異。
頭文件 local.h
函數列表
函數類別 函數用途 詳細說明
地區控制 地區設置 setlocale
數字格式約定查詢 國家的貨幣、日期、時間等的格式轉換 localeconv
數學函數
本分類給出了各種數學計算函數,必須提醒的是ANSI C標準中的數據格式並不符合IEEE754標準,一些C語言編譯器卻遵循IEEE754(例如frinklin C51)
頭文件 math.h
函數列表
函數類別 函數用途 詳細說明
錯誤條件處理 定義域錯誤(函數的輸入參數值不在規定的範圍內)
值域錯誤(函數的返回值不在規定的範圍內)
三角函數 反餘弦 acos
反正弦 asin
反正切 atan
反正切2 atan2
餘弦 cos
正弦 sin
正切 tan
雙曲函數 雙曲餘弦 cosh
雙曲正弦 sinh
雙曲正切 tanh
指數和對數 指數函數 exp
指數分解函數 frexp
乘積指數函數 fdexp
自然對數 log
以10為底的對數 log10
浮點數分解函數 modf
冪函數 冪函數 pow
平方根函數 sqrt
整數截斷,絕對值和求餘數函數 求下限接近整數 ceil
絕對值 fabs
求上限接近整數 floor
求餘數 fmod
本分類函數用於實現在不同底函數之間直接跳轉代碼。 頭文件 setjmp.h io.h
函數列表
函數類別 函數用途 詳細說明
保存調用環境 setjmp
恢復調用環境 longjmp
信號處理
該分類函數用於處理那些在程序執行過程中發生例外的情況。
頭文件 signal.h
函數列表
函數類別 函數用途 詳細說明
指定信號處理函數 signal
發送信號 raise
可變參數處理
本類函數用於實現諸如printf,scanf等參數數量可變底函數。
頭文件 stdarg.h
函數列表
函數類別 函數用途 詳細說明
可變參數訪問宏 可變參數開始宏 va_start
可變參數結束宏 va_end
可變參數訪問宏 訪問下一個可變參數宏 va_arg
輸入輸出函數
該分類用於處理包括文件、控制台等各種輸入輸出設備,各種函數以“流”的方式實現
頭文件 stdio.h
函數列表
函數類別 函數用途 詳細說明
文件操作
刪除文件 remove
修改文件名稱 rename
生成臨時文件名稱 tmpfile
得到臨時文件路徑 tmpnam
文件訪問 關閉文件 fclose
刷新緩衝區 fflush
打開文件 fopen
將已存在的流指針和新文件連接 freopen
設置磁盤緩衝區 setbuf
設置磁盤緩衝區 setvbuf
格式化輸入與輸出函數 格式輸出 fprintf
格式輸入 fscanf
格式輸出(控制台) printf
格式輸入(控制台) scanf
格式輸出到緩衝區 sprintf
從緩衝區中按格式輸入 sscanf
格式化輸出 vfprintf
格式化輸出 vprintf
格式化輸出 vsprintf
字符輸入輸出函數 輸入一個字符 fgetc
字符串輸入 fgets
字符輸出 fputc
字符串輸出 fputs
字符輸入(控制台) getc
字符輸入(控制台) getchar
字符串輸入(控制台) gets
字符輸出(控制台) putc
字符輸出(控制台) putchar
字符串輸出(控制台) puts
字符輸出到流的頭部 ungetc
直接輸入輸出 直接流讀操作 fread
直接流寫操作 fwrite
文件定位函數 得到文件位置 fgetpos
文件位置移動 fseek
文件位置設置 fsetpos
得到文件位置 ftell
文件位置復零位 remind
錯誤處理函數 錯誤清除 clearerr
文件結尾判斷 feof
文件錯誤檢測 ferror
得到錯誤提示字符串 perror
實用工具函數
本分類給出了一些函數無法按以上分類,但又是編程所必須要的。
頭文件 stdlib.h
函數列表
函數類別 函數用途 詳細說明
字符串轉換函數 字符串轉換為整數 atoi
字符串轉換為長整數 atol
字符串轉換為浮點數 strtod
字符串轉換為長整數 strtol
字符串轉換為無符號長整型 strtoul
偽隨機序列產生函數 產生隨機數 rand
設置隨機函數的起動數值 srand
存儲管理函數 分配存儲器 calloc
釋放存儲器 free
存儲器分配 malloc
重新分配存儲器 realloc
環境通信 中止程序 abort
退出程序執行,並清除環境變量 atexit
退出程序執行 exit
讀取環境參數 getenv
程序掛起,臨時執行一個其他程序 system
搜索和排序工具 二分查找(數據必須已排序) bsearch
快速排序 qsort
整數運算函數 求絕對值 abs
div
得到除法運算底商和餘數
求長整形底絕對值 labs
求長整形除法的商和餘數 ldiv
多字節字符函數 得到多字節字符的字節數 mblen
得到多字節字符的字節數 mbtowc
多字節字符轉換 wctomb
多字節字符的字符串操作 將多字節串轉換為整數數組 mbstowcs
將多字節串轉換為字符數組 mcstowbs
字符串處理
本分類的函數用於對字符串進行合併、比較等操作
頭文件 string.h
函數列表
函數類別 函數用途 詳細說明
字符串拷貝 塊拷貝(目的和源存儲區不可重疊) memcpy
塊拷貝(目的和源存儲區可重疊) memmove
串拷貝 strcpy
按長度的串拷貝 strncpy
字符串連接函數 串連接 strcat
按長度連接字符串 strncat
串比較函數 塊比較 memcmp
字符串比較 strcmp
字符串比較(用於非英文字符) strcoll
按長度對字符串比較 strncmp
字符串轉換 strxfrm
字符與字符串查找 字符查找 memchr
字符查找 strchr
字符串查找 strcspn
字符串查找 strpbrk
字符串查找 strspn
字符串查找 strstr
字符串分解 strtok
雜類函數 字符串設置 memset
錯誤字符串映射 strerror
求字符串長度 strlen
日期和時間函數
本類別給出時間和日期處理函數
頭文件 time.h
函數列表
函數類別 函數用途 詳細說明
時間操作函數 得到處理器時間 clock
得到時間差 difftime
設置時間 mktime
得到時間 time
時間轉換函數 得到以ASCII碼錶示的時間 asctime
得到字符串表示的時間 ctime
得到指定格式的時間 strftime
函數庫未來的發展方向
本部分用於說明各類別函數庫在將來如何發展。
序號 庫類別 頭文件 詳細說明
1 錯誤處理 errno.h
2 字符處理 ctype.h
3 地區化 local.h
4 數學函數 math.h
5 信號處理 signal.h
6 輸入輸出 stdio.h
7 實用工具程序 stdlib.h
8 字符串處理 string.h
C語言函數的特點及其定義?
C語言中一個函數(function)是一個可以從程序其它地方調用執行的語句塊。
1、通過使用函數(functions)我們可以把我們的程序以更模塊化的形式組織起來,從而利用C語言所支持的結構化程序設計。
2、從數學角度,函數即集合A和集合B之間的映射關係。實際上計算機中的函數概念也是源於此,因此,一般函數,都有形參和返回值。
3、從計算機組成原理的角度來看,函數即是一個小型的計算機系統,依據馮諾伊曼的“存儲程序原理”,每一個計算機系統包含:輸入系統、輸出系統、運算器以及控制器,實際上對於C語言中的函數來說,它是“存儲程序原理”的軟實現,其中形參、實參這是輸入系統,返回值是輸出系統,函數體中的運算符,比如+、-、*、/四則運算即為運算器,而邏輯運算符以及if、while等控制語句便是一個控制器。
如何用C語言生成一個正態分布的樣本
調試程序時,隨機數種子可以設常數,例如srand(54321);
用 rand() 產生均勻分布隨機數 x1,x2
利用瑞利分布得正態分布隨機數 y1,y2
再按要求線性縮放一下到[0.01,2] 區間。
#include stdio.h
#include stdlib.h
#include math.h
#include time.h
main(){
#define N 100
double rd[N];
double x1,x2,y1,y2;
double pi2=6.28318530728,mx,mi,ave=0;
int i;
//srand(54321);
srand(time(NULL));
for (i=0;i=N-2;i=i+2){
x1=1.0*rand()/RAND_MAX;
x2=1.0*rand()/RAND_MAX;
y1= sqrt((-2.0*log(x1))) * cos(pi2*x2);
y2= sqrt((-2.0*log(x1))) * sin(pi2*x2);
rd[i]=y1;
rd[i+1]=y2;
}
mx=rd[0];mi=rd[0];
for (i=0;iN;i++){
if (rd[i]mx)mx=rd[i];
if (rd[i]mi)mi=rd[i];
}
//printf(“mi=%lf mx=%lf\n”,mi,mx);
for (i=0;iN;i++) rd[i] = (rd[i]-mi)/(mx-mi+0.001) * (2.0-0.01) + 0.01;
for (i=0;iN-2;i=i+2) printf(“%lf %lf\n”,rd[i],rd[i+1]);
return 0;
}
我需要c語言每個頭文件里的所有函數介紹及用法!
分類函數,所在函數庫為ctype.h
int isalpha(int ch) 若ch是字母(‘A’-‘Z’,’a’-‘z’)返回非0值,否則返回0
int isalnum(int ch) 若ch是字母(‘A’-‘Z’,’a’-‘z’)或數字(‘0’-‘9’)
返回非0值,否則返回0
int isascii(int ch) 若ch是字符(ASCII碼中的0-127)返回非0值,否則返回0
int iscntrl(int ch) 若ch是作廢字符(0x7F)或普通控制字符(0x00-0x1F)
返回非0值,否則返回0
int isdigit(int ch) 若ch是數字(‘0’-‘9’)返回非0值,否則返回0
int isgraph(int ch) 若ch是可打印字符(不含空格)(0x21-0x7E)返回非0值,否則返回0
int islower(int ch) 若ch是小寫字母(‘a’-‘z’)返回非0值,否則返回0
int isprint(int ch) 若ch是可打印字符(含空格)(0x20-0x7E)返回非0值,否則返回0
int ispunct(int ch) 若ch是標點字符(0x00-0x1F)返回非0值,否則返回0
int isspace(int ch) 若ch是空格(‘ ‘),水平製表符(‘\t’),回車符(‘\r’),
走紙換行(‘\f’),垂直製表符(‘\v’),換行符(‘\n’)
返回非0值,否則返回0
int isupper(int ch) 若ch是大寫字母(‘A’-‘Z’)返回非0值,否則返回0
int isxdigit(int ch) 若ch是16進制數(‘0’-‘9′,’A’-‘F’,’a’-‘f’)返回非0值,
否則返回0
int tolower(int ch) 若ch是大寫字母(‘A’-‘Z’)返回相應的小寫字母(‘a’-‘z’)
int toupper(int ch) 若ch是小寫字母(‘a’-‘z’)返回相應的大寫字母(‘A’-‘Z’)
數學函數,所在函數庫為math.h、stdlib.h、string.h、float.h
int abs(int i) 返回整型參數i的絕對值
double cabs(struct complex znum) 返回複數znum的絕對值
double fabs(double x) 返回雙精度參數x的絕對值
long labs(long n) 返回長整型參數n的絕對值
double exp(double x) 返回指數函數ex的值
double frexp(double value,int *eptr) 返回value=x*2n中x的值,n存貯在eptr中
double ldexp(double value,int exp); 返回value*2exp的值
double log(double x) 返回logex的值
double log10(double x) 返回log10x的值
double pow(double x,double y) 返回xy的值
double pow10(int p) 返回10p的值
double sqrt(double x) 返回+√x的值
double acos(double x) 返回x的反餘弦cos-1(x)值,x為弧度
double asin(double x) 返回x的反正弦sin-1(x)值,x為弧度
double atan(double x) 返回x的反正切tan-1(x)值,x為弧度
double atan2(double y,double x) 返回y/x的反正切tan-1(x)值,y的x為弧度
double cos(double x) 返回x的餘弦cos(x)值,x為弧度
double sin(double x) 返回x的正弦sin(x)值,x為弧度
double tan(double x) 返回x的正切tan(x)值,x為弧度
double cosh(double x) 返回x的雙曲餘弦cosh(x)值,x為弧度
double sinh(double x) 返回x的雙曲正弦sinh(x)值,x為弧度
double tanh(double x) 返回x的雙曲正切tanh(x)值,x為弧度
double hypot(double x,double y) 返回直角三角形斜邊的長度(z),
x和y為直角邊的長度,z2=x2+y2
double ceil(double x) 返回不小於x的最小整數
double floor(double x) 返回不大於x的最大整數
void srand(unsigned seed) 初始化隨機數發生器
int rand() 產生一個隨機數並返回這個數
double poly(double x,int n,double c[])從參數產生一個多項式
double modf(double value,double *iptr)將雙精度數value分解成尾數和階
double fmod(double x,double y) 返回x/y的餘數
double frexp(double value,int *eptr) 將雙精度數value分成尾數和階
double atof(char *nptr) 將字符串nptr轉換成浮點數並返回這個浮點數
double atoi(char *nptr) 將字符串nptr轉換成整數並返回這個整數
double atol(char *nptr) 將字符串nptr轉換成長整數並返回這個整數
char *ecvt(double value,int ndigit,int *decpt,int *sign)
將浮點數value轉換成字符串並返回該字符串
char *fcvt(double value,int ndigit,int *decpt,int *sign)
將浮點數value轉換成字符串並返回該字符串
char *gcvt(double value,int ndigit,char *buf)
將數value轉換成字符串並存於buf中,並返回buf的指針
char *ultoa(unsigned long value,char *string,int radix)
將無符號整型數value轉換成字符串並返回該字符串,radix為轉換時所用基數
char *ltoa(long value,char *string,int radix)
將長整型數value轉換成字符串並返回該字符串,radix為轉換時所用基數
char *itoa(int value,char *string,int radix)
將整數value轉換成字符串存入string,radix為轉換時所用基數
double atof(char *nptr) 將字符串nptr轉換成雙精度數,並返回這個數,錯誤返回0
int atoi(char *nptr) 將字符串nptr轉換成整型數, 並返回這個數,錯誤返回0
long atol(char *nptr) 將字符串nptr轉換成長整型數,並返回這個數,錯誤返回0
double strtod(char *str,char **endptr)將字符串str轉換成雙精度數,並返回這個數,
long strtol(char *str,char **endptr,int base)將字符串str轉換成長整型數,
並返回這個數,
int matherr(struct exception *e)
用戶修改數學錯誤返回信息函數(沒有必要使用)
double _matherr(_mexcep why,char *fun,double *arg1p,
double *arg2p,double retval)
用戶修改數學錯誤返回信息函數(沒有必要使用)
unsigned int _clear87() 清除浮點狀態字並返回原來的浮點狀態
void _fpreset() 重新初使化浮點數學程序包
unsigned int _status87() 返回浮點狀態字
int chdir(char *path) 使指定的目錄path(如:”C:\\WPS”)變成當前的工作目錄,成
功返回0
int findfirst(char *pathname,struct ffblk *ffblk,int attrib)查找指定的文件,成功
返回0
pathname為指定的目錄名和文件名,如”C:\\WPS\\TXT”
ffblk為指定的保存文件信息的一個結構,定義如下:
┏━━━━━━━━━━━━━━━━━━━━┓
┃struct ffblk ┃
┃{ ┃
┃ char ff_reserved[21]; /*DOS保留字*/ ┃
┃ char ff_attrib; /*文件屬性*/ ┃
┃ int ff_ftime; /*文件時間*/ ┃
┃ int ff_fdate; /*文件日期*/ ┃
┃ long ff_fsize; /*文件長度*/ ┃
┃ char ff_name[13]; /*文件名*/ ┃
┃} ┃
┗━━━━━━━━━━━━━━━━━━━━━┛
attrib為文件屬性,由以下字符代表
┏━━━━━━━━━┳━━━━━━━━━┓
┃FA_RDONLY 只讀文件┃FA_LABEL 卷標號 ┃
┃FA_HIDDEN 隱藏文件┃FA_DIREC 目錄 ┃
┃FA_SYSTEM 系統文件┃FA_ARCH 檔案 ┃
┗━━━━━━━━━┻━━━━━━━━━┛
例:
struct ffblk ff;
findfirst(“*.wps”,ff,FA_RDONLY);
int findnext(struct ffblk *ffblk) 取匹配finddirst的文件,成功返回0
void fumerge(char *path,char *drive,char *dir,char *name,char *ext)
此函數通過盤符drive(C:、A:等),路徑dir(\TC、\BC\LIB等),
文件名name(TC、WPS等),擴展名ext(.EXE、.COM等)組成一個文件名
存與path中.
int fnsplit(char *path,char *drive,char *dir,char *name,char *ext)
此函數將文件名path分解成盤符drive(C:、A:等),路徑dir(\TC、\BC\LIB等),
文件名name(TC、WPS等),擴展名ext(.EXE、.COM等),並分別存入相應的變量中.
int getcurdir(int drive,char *direc) 此函數返回指定驅動器的當前工作目錄名稱
drive 指定的驅動器(0=當前,1=A,2=B,3=C等)
direc 保存指定驅動器當前工作路徑的變量 成功返回0
char *getcwd(char *buf,iint n) 此函數取當前工作目錄並存入buf中,直到n個字
節長為為止.錯誤返回NULL
int getdisk() 取當前正在使用的驅動器,返回一個整數(0=A,1=B,2=C等)
int setdisk(int drive) 設置要使用的驅動器drive(0=A,1=B,2=C等),
返回可使用驅動器總數
int mkdir(char *pathname) 建立一個新的目錄pathname,成功返回0
int rmdir(char *pathname) 刪除一個目錄pathname,成功返回0
char *mktemp(char *template) 構造一個當前目錄上沒有的文件名並存於template中
char *searchpath(char *pathname) 利用MSDOS找出文件filename所在路徑,
,此函數使用DOS的PATH變量,未找到文件返回NULL
進程函數,所在函數庫為stdlib.h、process.h
void abort() 此函數通過調用具有出口代碼3的_exit寫一個終止信息於stderr,
並異常終止程序。無返回值
int exec…裝入和運行其它程序
int execl( char *pathname,char *arg0,char *arg1,…,char *argn,NULL)
int execle( char *pathname,char *arg0,char *arg1,…,
char *argn,NULL,char *envp[])
int execlp( char *pathname,char *arg0,char *arg1,…,NULL)
int execlpe(char *pathname,char *arg0,char *arg1,…,NULL,char *envp[])
int execv( char *pathname,char *argv[])
int execve( char *pathname,char *argv[],char *envp[])
int execvp( char *pathname,char *argv[])
int execvpe(char *pathname,char *argv[],char *envp[])
exec函數族裝入並運行程序pathname,並將參數
arg0(arg1,arg2,argv[],envp[])傳遞給子程序,出錯返回-1
在exec函數族中,後綴l、v、p、e添加到exec後,
所指定的函數將具有某種操作能力
有後綴 p時,函數可以利用DOS的PATH變量查找子程序文件。
l時,函數中被傳遞的參數個數固定。
v時,函數中被傳遞的參數個數不固定。
e時,函數傳遞指定參數envp,允許改變子進程的環境,
無後綴e時,子進程使用當前程序的環境。
void _exit(int status)終止當前程序,但不清理現場
void exit(int status) 終止當前程序,關閉所有文件,寫緩衝區的輸出(等待輸出),
並調用任何寄存器的”出口函數”,無返回值
int spawn…運行子程序
int spawnl( int mode,char *pathname,char *arg0,char *arg1,…,
char *argn,NULL)
int spawnle( int mode,char *pathname,char *arg0,char *arg1,…,
char *argn,NULL,char *envp[])
int spawnlp( int mode,char *pathname,char *arg0,char *arg1,…,
char *argn,NULL)
int spawnlpe(int mode,char *pathname,char *arg0,char *arg1,…,
char *argn,NULL,char *envp[])
int spawnv( int mode,char *pathname,char *argv[])
int spawnve( int mode,char *pathname,char *argv[],char *envp[])
int spawnvp( int mode,char *pathname,char *argv[])
int spawnvpe(int mode,char *pathname,char *argv[],char *envp[])
spawn函數族在mode模式下運行子程序pathname,並將參數
arg0(arg1,arg2,argv[],envp[])傳遞給子程序.出錯返回-1
mode為運行模式
mode為 P_WAIT 表示在子程序運行完後返回本程序
P_NOWAIT 表示在子程序運行時同時運行本程序(不可用)
P_OVERLAY表示在本程序退出後運行子程序
在spawn函數族中,後綴l、v、p、e添加到spawn後,
所指定的函數將具有某種操作能力
有後綴 p時, 函數利用DOS的PATH查找子程序文件
l時, 函數傳遞的參數個數固定.
v時, 函數傳遞的參數個數不固定.
e時, 指定參數envp可以傳遞給子程序,允許改變子程序運行環境.
當無後綴e時,子程序使用本程序的環境.
int system(char *command) 將MSDOS命令command傳遞給DOS執行
轉換子程序,函數庫為math.h、stdlib.h、ctype.h、float.h
char *ecvt(double value,int ndigit,int *decpt,int *sign)
將浮點數value轉換成字符串並返回該字符串
char *fcvt(double value,int ndigit,int *decpt,int *sign)
將浮點數value轉換成字符串並返回該字符串
char *gcvt(double value,int ndigit,char *buf)
將數value轉換成字符串並存於buf中,並返回buf的指針
char *ultoa(unsigned long value,char *string,int radix)
將無符號整型數value轉換成字符串並返回該字符串,radix為轉換時所用基數
char *ltoa(long value,char *string,int radix)
將長整型數value轉換成字符串並返回該字符串,radix為轉換時所用基數
char *itoa(int value,char *string,int radix)
將整數value轉換成字符串存入string,radix為轉換時所用基數
double atof(char *nptr) 將字符串nptr轉換成雙精度數,並返回這個數,錯誤返回0
int atoi(char *nptr) 將字符串nptr轉換成整型數, 並返回這個數,錯誤返回0
long atol(char *nptr) 將字符串nptr轉換成長整型數,並返回這個數,錯誤返回0
double strtod(char *str,char **endptr)將字符串str轉換成雙精度數,並返回這個數,
long strtol(char *str,char **endptr,int base)將字符串str轉換成長整型數,
並返回這個數,
int toascii(int c) 返回c相應的ASCII
int tolower(int ch) 若ch是大寫字母(‘A’-‘Z’)返回相應的小寫字母(‘a’-‘z’)
int _tolower(int ch) 返回ch相應的小寫字母(‘a’-‘z’)
int toupper(int ch) 若ch是小寫字母(‘a’-‘z’)返回相應的大寫字母(‘A’-‘Z’)
int _toupper(int ch) 返回ch相應的大寫字母(‘A’-‘Z’)
診斷函數,所在函數庫為assert.h、math.h
void assert(int test) 一個擴展成if語句那樣的宏,如果test測試失敗,
就顯示一個信息並異常終止程序,無返回值
void perror(char *string) 本函數將顯示最近一次的錯誤信息,格式如下:
字符串string:錯誤信息
char *strerror(char *str) 本函數返回最近一次的錯誤信息,格式如下:
字符串str:錯誤信息
int matherr(struct exception *e)
用戶修改數學錯誤返回信息函數(沒有必要使用)
double _matherr(_mexcep why,char *fun,double *arg1p,
double *arg2p,double retval)
用戶修改數學錯誤返回信息函數(沒有必要使用)
怎麼調用c語言中的標準正態分布函數?
摘要:
隨機數在實際運用中非常之多,如遊戲設計,信號處理,通常我們很容易得到平均分布的隨機數。但如何根據平均分布的隨機數進而產生其它分布的隨機數呢?本文提出了一種基於幾何直觀面積的方法,以正態分布隨機數的產生為例討論了任意分布的隨機數的產生方法。
大家都知道,隨機數在各個方面都有很大的作用,在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()%10000;
然後保留四位小數產生0~1之間的隨機小數:
double b = (double)a/10000.0;
然後通過線性組合就可以實現任意範圍內的隨機數的產生,要實現-1000~1000內的平均分布的隨機數可以這樣做:
double dValue = (rand()%10000)/10000.0*1000-(rand()%10000)/10000.0*1000;
則dValue就是所要的值。
到現在為止,你或許以為一切工作都已經完成了,其實不然,仔細一看,你會發現有問題的,上面的式子化簡後就變為:
double dValue = (rand()%10000)/10.0-(rand()%10000)/10.0;
這樣一來,產生的隨機數範圍是正確的,但是精度不正確了,變成了只有一位正確的小數的隨機數了,後面三位的小數都是零,顯然不是我們要求的,什麼原因呢,又怎麼辦呢。
先找原因,rand()產生的隨機數分辨率為32767,兩個就是65534,而經過求余後分辨度還要減小為10000,兩個就是20000而要求的分辨率為1000*10000*2=20000000,顯然遠遠不夠。下面提供的方法可以實現正確的結果:
double a = (rand()%10000) * (rand()%1000)/10000.0;
double b = (rand()%10000) * (rand()%1000)/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);
}
請問:C語言中怎麼計算正態分布函數?
C語言中計算一個數的N次方可以用庫函數pow來實現。
函數原型:double pow(double x, double y);
功 能:計算x^y的值
返 回 值:計算結果
舉例如下:
double a = pow(3.14, 2); // 計算3.14的平方
註:使用pow函數時,需要將頭文件#includemath.h包含進源文件中。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/277845.html