Lab 1/20 利用隨機函數計算機率
參考程式:
====================
#include"stdio.h"
#include"stdlib.h"
#include"time.h"
void main()
{
int i=1;
srand((unsigned)time(NULL));
while(i<=10) { printf("%d\n",rand()); i++; } } ==================== 內容說明:
- rand()是取亂數的函數,放在stdlib.h標頭檔裡面
- 如果只利用rand()函數取亂數時,會取出相同的種子序列。因此,利用時間函數time()當成srand()函數的參數,以改變每次執行rand()函數所取的種子序列。
試試看,加了"srand((unsigned)time(NULL));"與不加有沒有什麼差別。
課堂練習2:
利用while迴圈加上亂數函數,請寫出擲骰子1000次,點數3所出現的次數
11 Comments:
#include stdio.h
#include stdlib.h
#include time.h
void main()
{
int a[6];
srand(time(NULL));
for(int i=0;i<=5;i++)
{
a[i]=rand()%43;
printf("%10d",a[i]);
}
printf("\n");
}
舊版的樂透程式
#include stdio.h
#include stdlib.h
#include time.h
int main()
{
int b[1000],a=0,i=0;
srand((unsigned)time(NULL));
while(i<1000)
{
b[i]=rand()%7;
if(b[i]==3)
{
a++;
}
i++;
}
printf("%d times.\n",a);
return 0;
}
上面兩篇運算要改
把第一則的a[i]=rand()%43;
改成a[i]=rand()%42+1;
把第二則的b[i]=rand()%7;
改成b[i]=rand()%6+1;
This comment has been removed by a blog administrator.
#include < stdio.h >
#include < stdlib.h >
#include < time.h >
int main()
{
int a=1,b,c=0;
srand((unsigned)time(NULL));
while(a<=1000)
{
b=rand()%6 +1;
printf("%d\n",b);
if(b==3)
c++;
a++;
}
printf("一共出現%d次點數3",c);
return 0;
}
應該是這樣吧~
#includestdio.h
#includestdlib.h
#includetime.h
void main()
{
int i = 1,j = 0,a = 0;
srand((unsigned)time(NULL));
while(i<=1000)
{
j = rand()%6;
if(j == 3)
{
a++;
}
j = 0;
i++;
}
printf("%d\n",a);
}
#include stdio.h
#include time.h
#include stdlib.h
void main()
{
int i,z,j=0;
srand((unsigned)time(NULL));
i=1;
while(i<=1000)
{
z=rand()%6+1;
if(z==3)
{
j++;
}
i++;
}
printf("擲骰子1000次內出現 %d 次3\n",j);
}
#include < stdio.h >
#include < stdlib.h >
#include < time.h >
void main()
{
int i=1,c=0;
srand((unsigned)time(NULL));
while(i<=1000)
{
int a=rand()%6;
printf("%d\n",a); i++;
if(a==3)
c++;
}
printf("出現點數3的機率為%d%%\n",c/10);
}
#include stdio.h
#include stdlib.h
#include time.h
void main()
{
int a,b,c=0,d;
srand((unsigned)time(NULL));
for(a=1;a<=1000;a++)
{
b=rand()%6+1;
printf("%d\n",b);
if(b==3)
{
c++;
}
}
printf("一共出現%d次點數3\n",c);
d=c/10;
printf("出現3的機率是%d%%\n",d);
}
OK!!大致上大家的觀念都有了,我提出幾點小意見跟大家一起分享:
1.變數簡化
(1)printf("%d",rand()%6+1);
(2)d=c/10;→c/=10;
2.盡量養成習慣以文字輔助,告訴大家所run出來的結果各代表什麼意思,或者告訴使用者應該要做什麼樣子的輸入動作。
3.樣本點是否必須顯示出來,或者以什麼模式顯示出來,可依題目需求。但是由於我已經說是一個骰子,樣本點的range,不適宜出現0~5,應為1~6。
4.如果直接對7取餘數,對於數學運算上機率的值可能就不太正確
5.不建議用陣列的方式去寫,因為這樣陣列所佔掉的空間會很大,除非題目有要你"保留"每一個樣本點
如果對於以上有問題的,歡迎再發文討論!!
給煜峰:
樂透的主體觀念有出來
"利用陣列存取其值"
"將亂數限制範圍"
希望能夠再多點東西
ex:輸入的值和電腦的中獎號碼的比對
限制輸入的的條件等等...
不過慢慢來啦
不用急
已經有雛型了!!!
Post a Comment
<< Home