本文目錄一覽:
C語言如何生成隨機數
在VC中設計到隨機數有兩個函數
srand()
and
rand()
srand()
的作用是是一個種子,提供每次獲得隨機數的基數而已,rand()根據種子而產生隨機數
注意
1:srand()
里的值必須是動態變化的,否則得到的隨機數就是一個固定數
2:其實可以不用寫srand()
,只用rand()就可以了,省事,簡單,例子如下
如果我們想得到一個
0-60的隨機數那麼可以寫成
int
i;
i=rand()%60;
就可以了。
當然最好有個統一的標註如下:
int
i;
srand((unsigned)time(
NULL
));
i=rand()%60;
這樣就OK了。
c語言隨機數怎麼生成
在實際編程中,我們經常需要生成隨機數。在c語言中我們通常使用rand方法生成隨機數,在調用rand前需要調用srand初始化隨機數種子。
電腦:華為MateBook14
系統:Windows10
軟體:notepad++等編輯器、gcc編譯器1.0
1、使用rand函數生成隨機數,rand隨機生成一個位於0 ~ RAND_MAX之間的整數。如下圖中,我們直接使用rand方法生成10個隨機數。
2、程序運行後生成了隨機數,但直接使用rand的問題在於,在下次程序調用時,生成的隨機數與上次一致。所以,rand函數雖然生成隨機數,但可以說是一個偽隨機。因為每次調用時,生成數字順序都是固定的。
3、為了在每次調用時生成不同的隨機數,使用srand函數初始化隨機數種子。只要隨機數種子變化了,那麼生成的隨機數就會改變。通常,srand使用當前時間作為種子。
4、但使用時間作為隨機數種子是否安全呢?我們目前程序執行的速度都太快了,一秒鐘對於計算機來說太漫長了。我們將生成隨機數的操作定義為函數,然後調用函數兩次,看生成的隨機數仍然時一樣。
5、優化函數也比較簡單,在使用時間的基礎上,我們還加上一個定增序號。這樣能保證就算同一秒鐘內多次調用,隨機數的種子都是不一樣的。
6、通常,我們需要獲取一定範圍內的隨機數。所以,在生成隨機數之後我們使用模運算獲取對應範圍內的數據。如生成0到100內的隨機數。
c語言如何實現隨機生成多個數組至少要100個
需要準備的材料分別有:電腦、C語言編譯器。
1、首先,打開C語言編譯器,新建一個初始.cpp文件,例如:test.cpp。
2、在test.cpp文件中,輸入C語言代碼:
srand((unsigned)time(NULL));
for (int i = 0;i 100; i++) {
printf(“%d “, rand());
}
3、編譯器運行test.cpp文件,此時成功隨機生成了100個隨機數。
C語言隨機
樓上說的是對的,你的printf裡面用了取地址符是不正確的下面是改過的程序
#includestdio.h
#includestdlib.h
#includetime.h
void main( )
{
int a,b,c,x,f;
char C;
while(1)
{
printf(“請選擇\n”);
printf(“加法請按1\n”);
printf(“減法請按2\n”);
printf(“乘法請按3\n”);
printf(“除法請按4\n”);
printf(“輸入其他退出\n”);
scanf(“%d”,x);
srand( (unsigned)time( NULL ) );
if (x5) switch(x)
{
case 1:a=rand()%100;
b=rand()%100;
printf(“%2d+%2d=\n”,a,b);
printf(“請輸入a+b的答案\n”) ;
scanf(“%d”,c);
if (c==(a+b))printf(“very good\n\n”);
else printf(“需要努力\n答案是%d “,a+b);
break;
case 2:a=rand()%100 ;
b=rand()%100;
if (ab){f=a;a=b;b=f;}
printf(“%d-%d\n”,a,b);
printf(“請輸入a-b的答案\n”) ;
scanf(“%d”,c);
if (c==(a-b)) printf(“very good\n\n”);
else printf(“需要努力\n答案是%d “,a-b);
break;
case 3: a=rand()%100 ;
b=rand()%100 ;
printf(“%d*%d\n”,a,b);
printf(“請輸入a*b的答案”) ;
scanf(“%d”,c);
if (c==(a*b)) printf(“very good\n\n”);
else printf(“需要努力\n答案是%d “,a*b);
break;
case 4: a=rand()%100 ;
b=rand()%100 ;
if (ab)
{f=a;
a=b;
b=f;
}
printf(“%d/%d\n”,a,b);
printf(“請輸入a除b的答案”) ;
scanf(“%d”,c);
if (c==(a/b)) printf(“very good\n\n”);
else printf(“需要努力\n答案是%d “,a/b);
break;
}
else printf(“確定要退出嗎?y/n\n”);
scanf(“%c”,C);
if(C==’y’)break;
}
}
c語言,如何產生隨機數?
本文由青松原創並依GPL-V2及其後續版本發放,轉載請註明出處且應包含本行聲明。\x0d\x0a\x0d\x0aC++中常用rand()函數生成隨機數,但嚴格意義上來講生成的只是偽隨機數(pseudo-random integral number)。生成隨機數時需要我們指定一個種子,如果在程序內循環,那麼下一次生成隨機數時調用上一次的結果作為種子。但如果分兩次執行程序,那麼由於種子相同,生成的「隨機數」也是相同的。\x0d\x0a\x0d\x0a在工程應用時,我們一般將系統當前時間(Unix時間)作為種子,這樣生成的隨機數更接近於實際意義上的隨機數。給一下常式如下:\x0d\x0a\x0d\x0a#include \x0d\x0a#include \x0d\x0a#include \x0d\x0ausing namespace std;\x0d\x0a\x0d\x0aint main()\x0d\x0a{\x0d\x0a double random(double,double);\x0d\x0a srand(unsigned(time(0)));\x0d\x0a for(int icnt = 0; icnt != 10; ++icnt)\x0d\x0a cout “No.” icnt+1 “: ” int(random(0,10)) endl;\x0d\x0a return 0;\x0d\x0a}\x0d\x0a\x0d\x0adouble random(double start, double end)\x0d\x0a{\x0d\x0a return start+(end-start)*rand()/(RAND_MAX + 1.0);\x0d\x0a}\x0d\x0a/* 運行結果\x0d\x0a* No.1: 3\x0d\x0a* No.2: 9\x0d\x0a* No.3: 0\x0d\x0a* No.4: 9\x0d\x0a* No.5: 5\x0d\x0a* No.6: 6\x0d\x0a* No.7: 9\x0d\x0a* No.8: 2\x0d\x0a* No.9: 9\x0d\x0a* No.10: 6\x0d\x0a*/\x0d\x0a利用這種方法能不能得到完全意義上的隨機數呢?似乎9有點多哦?卻沒有1,4,7?!我們來做一個概率實驗,生成1000萬個隨機數,看0-9這10個數出現的頻率是不是大致相同的。程序如下:\x0d\x0a#include \x0d\x0a#include \x0d\x0a#include \x0d\x0a#include \x0d\x0ausing namespace std;\x0d\x0a\x0d\x0aint main()\x0d\x0a{\x0d\x0a double random(double,double);\x0d\x0a int a[10] = ;\x0d\x0a const int Gen_max = 10000000;\x0d\x0a srand(unsigned(time(0)));\x0d\x0a \x0d\x0a for(int icnt = 0; icnt != Gen_max; ++icnt)\x0d\x0a switch(int(random(0,10)))\x0d\x0a {\x0d\x0a case 0: a[0]++; break;\x0d\x0a case 1: a[1]++; break;\x0d\x0a case 2: a[2]++; break;\x0d\x0a case 3: a[3]++; break;\x0d\x0a case 4: a[4]++; break;\x0d\x0a case 5: a[5]++; break;\x0d\x0a case 6: a[6]++; break;\x0d\x0a case 7: a[7]++; break;\x0d\x0a case 8: a[8]++; break;\x0d\x0a case 9: a[9]++; break;\x0d\x0a default: cerr “Error!” endl; exit(-1);\x0d\x0a }\x0d\x0a \x0d\x0a for(int icnt = 0; icnt != 10; ++icnt)\x0d\x0a cout icnt “: ” setw(6) setiosflags(ios::fixed) setprecision(2) double(a[icnt])/Gen_max*100 “%” endl;\x0d\x0a \x0d\x0a return 0;\x0d\x0a}\x0d\x0a\x0d\x0adouble random(double start, double end)\x0d\x0a{\x0d\x0a return start+(end-start)*rand()/(RAND_MAX + 1.0);\x0d\x0a}\x0d\x0a/* 運行結果\x0d\x0a* 0: 10.01%\x0d\x0a* 1: 9.99%\x0d\x0a* 2: 9.99%\x0d\x0a* 3: 9.99%\x0d\x0a* 4: 9.98%\x0d\x0a* 5: 10.01%\x0d\x0a* 6: 10.02%\x0d\x0a* 7: 10.01%\x0d\x0a* 8: 10.01%\x0d\x0a* 9: 9.99%\x0d\x0a*/\x0d\x0a可知用這種方法得到的隨機數是滿足統計規律的。\x0d\x0a\x0d\x0a另:在Linux下利用GCC編譯程序,即使我執行了1000000次運算,是否將random函數定義了inline函數似乎對程序沒有任何影響,有理由相信,GCC已經為我們做了優化。但是冥冥之中我又記得要做inline優化得加O3才行…\x0d\x0a\x0d\x0a不行,於是我們把循環次數改為10億次,用time命令查看執行時間:\x0d\x0achinsung@gentoo ~/workspace/test/Debug $ time ./test \x0d\x0a0: 10.00%\x0d\x0a1: 10.00%\x0d\x0a2: 10.00%\x0d\x0a3: 10.00%\x0d\x0a4: 10.00%\x0d\x0a5: 10.00%\x0d\x0a6: 10.00%\x0d\x0a7: 10.00%\x0d\x0a8: 10.00%\x0d\x0a9: 10.00%\x0d\x0a\x0d\x0areal 2m7.768s\x0d\x0auser 2m4.405s\x0d\x0asys 0m0.038s\x0d\x0achinsung@gentoo ~/workspace/test/Debug $ time ./test \x0d\x0a0: 10.00%\x0d\x0a1: 10.00%\x0d\x0a2: 10.00%\x0d\x0a3: 10.00%\x0d\x0a4: 10.00%\x0d\x0a5: 10.00%\x0d\x0a6: 10.00%\x0d\x0a7: 10.00%\x0d\x0a8: 10.00%\x0d\x0a9: 10.00%\x0d\x0a\x0d\x0areal 2m7.269s\x0d\x0auser 2m4.077s\x0d\x0asys 0m0.025s\x0d\x0a\x0d\x0a前一次為進行inline優化的情形,後一次為沒有作inline優化的情形,兩次結果相差不大,甚至各項指標後者還要好一些,不知是何緣由…
c語言怎麼生成隨機數?
你好!
完整的代碼,紅圈處就是從上面100個數字中抽取到的數字:
#include stdio.h
#includestdlib.h //生成隨機數用
#includetime.h //利用時間生成種子
#includemath.h
int main()
{
int i;
int a[100];
srand( time(NULL) ); //生成種子
for(i=0;i100;i++)
{
a[i]=rand()%1000+1000; //生成一個小於1000的隨機數
//然後加1000,變成 1000 – 2000之間的數
printf(“%d “,a[i]); //列印
}
i=rand()%100; //隨機抽取其中的一個數
printf(“\n抽取到的是:%d\n”,a[i]);//列印
return 0;
}
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/243386.html