C語言隨機數的生成【詳解】
C語言隨機數的生成【詳解】
目錄
-
一、rand 函式 和 srand 函式
在C語言中比較常用的隨機函式是 rand 函式,它可以隨機的產生 0 ~ rand_max 的隨機數,定義型別不同最大值也不同,rand 函式包含在標頭檔案stdlib.h中。
#include <stdio.h> #include <stdlib.h> int main() {<!-- --> int a=rand(); printf("%d",a); return 0; }
執行結果………………………………………… 你會發現每次產生的隨機數都是相同的,因為rand 函式產生的隨機數是偽隨機數,是根據一個數按照某個公式推算出來的,這個數我們稱之為“種子”,但是這個種子在系統啟動之後就是一個定值。
要想每次產生的隨機數不一樣,那麼,我們就要用到 srand 函式。
srand() 函式原型是:
void srand (usigned int seed);
rand() 產生隨機數時,如果用srand(seed) 播下種子之後,一旦種子相同,產生的隨機數將是相同的。當然很多時候刻意讓rand() 產生的隨機數隨機化,用時間作種子 srand(time(NULL)) ,這樣每次執行程式的時間肯定是不相同的,產生的隨機數肯定就不一樣了。 此段原文連結:
通常可以利用 time(0) 或 getpid(0) 作為seed的返回值,下面我們只介紹用time(0)實現隨機數。
srand((unsigned)time(NULL)); //用時間作種子
#include<stdio.h> #include<stdlib.h> #include<time.h> int main() {<!-- --> srand((unsigned)time(NULL)); int n=rand(); printf("%d\n",n); return 0; }
此時我們就可以隨機產生一個數了。
二、生成範圍隨機數公式
但,作題時我們往往不會用到上面這種方式去產生一個隨機數,而是希望產生一定範圍內的資料。
1
產生隨機數範圍:[0,9]int a=rand()%10; //注意10會被整除,所以不包括10
2
產生隨機數範圍:[0,99]int a=rand()%100;
3
產生隨機數範圍:[66,88]int a=66+rand()%23;
結論
產生隨機數範圍:[m,n]int a=m+rand()%(n-m+1);
接下來舉幾個例子:
注意:下面的程式會將 srand((unsigned)time(NULL)) 換成 srand(time(0)),用srand(time(0))方便,且一樣可以滿足以上產生範圍隨機數的各種情況。
三、隨機數例項:選擇排序等
① 隨機產生10個[150,270)範圍內隨機數
#include<stdio.h> #include<stdlib.h> #include<time.h> int main() {<!-- --> int a[11]; int i; printf("隨機產生10個[150,270)範圍內隨機數:\n\n"); srand(time(0)); //srand(time(NULL)); for(i=1;i<=10;i++) //一般鍵盤隨機輸入10個數方式:scanf("%d",&a[i]); a[i]=150+rand()%120; for(i=1;i<=10;i++) printf("%d ",a[i]); printf("\n"); return 0; }
執行結果………………………………………… ② 隨機產生10個[0,99)範圍內隨機數(`指標`)
#include<stdio.h> #include<stdlib.h> #include<time.h> int main() {<!-- --> int a[10]; int *p; printf("隨機產生10個[0,99)範圍內隨機數:\n\n"); srand(time(0)); //srand(time(NULL)); for(p=a;p<(a+10);p++) *p=rand()%100; for(p=a;p<(a+10);p++) printf("%d ",*p); //使用指標指向當前的陣列元素 printf("\n"); return 0; }
執行結果………………………………………… ③ 地址 — 隨機數
#include<stdio.h> #include<stdlib.h> #include<time.h> int main() {<!-- --> int a[10]; int i; printf("產生10個[0,99]隨機數:\n\n"); srand(time(0)); //srand(time(NULL)); for(i=0;i<10;i++) {<!-- --> a[i]=rand()%100; //隨機函式產生 [0,100) printf("%d ",a[i]); } printf("\n\n"); printf(" 地址 --- 隨機數\n\n"); for(i=0;i<10;i++) printf(" %d --- %d\n",a+i,*(a+i)); //通過原陣列名和元素序號計算地址 printf("\n"); return 0; }
執行結果…………………………………………
④ 例項:選擇排序
#include<stdio.h> #include<stdlib.h> #include<time.h> int main() {<!-- --> int a[10]; int i,t,j,min; srand(time(0)); printf("隨機產生10個[0,99]隨機數:\n"); for(i=0;i<10;i++) a[i]=rand()%100; //產生10隨機數 for(i=0;i<10;i++) printf("%d ",a[i]); //輸出隨機數 printf("\n\n"); for(i=0;i<=9;i++) {<!-- --> min=i; for(j=i+1;j<10;j++) if(a[min]>a[j]) min=j; if(i!=min) {<!-- --> t=a[i]; a[i]=a[min]; a[min]=t; } } printf("由小到大排序:\n"); for(i=0;i<10;i++) printf("%d ",a[i]); return 0; }
執行結果…………………………………………