重慶分公司,新征程啟航
為企業提供網站建設、域名注冊、服務器等服務
為企業提供網站建設、域名注冊、服務器等服務
這是典型的古典概型,直接用窮舉法計算即可。
創新互聯建站主營米林網站建設的網絡公司,主營網站建設方案,App定制開發,米林h5微信平臺小程序開發搭建,米林網站營銷推廣歡迎米林等地區企業咨詢
計算思路是遍歷1到10共10個數的所有組合(用goNext函數),統計出組合總數count與7個數之和等于20的組數successNumber,這兩個數的商successNumber/count就是所求的概率。
計算結果為:
總次數: 10000000, 成功次數: 26544, 概率: 0.0026544
程序可以如下實現:
#include stdio.h
int data[7];
int goNext()
{
int i;
for ( i = 0; i 7 ++data[i] 10; ++i ) data[i] = 1;
if ( i == 7 ) return 0;
return 1;
}
void main()
{
int i, m;
double p;
long count = 0, successNumber = 0;
for ( i = 0; i 7; ++i) data[i] = 1;
do
{
++count;
for ( i = 0, m = 0; i 7; ++i ) m += data[i];
if ( 20 == m ) ++ successNumber;
} while ( goNext() );
p = (double) successNumber / (double) count;
printf("總次數: %d, 成功次數: %d, 概率: %.7lf\n", count, successNumber, p);
}
呵呵。大家的好像都很專業。如果我沒記錯,這是一個高考數學題,你應該是個高中生吧。
可以用深度優先搜索(遞歸回溯),這樣比較簡單。
大致的思路是這樣
用一個數組 f[6],f[1]~f[5]代表那5袋方便面。
用遞歸或者循環的方法生成123 放到這5個位置(就是窮舉這total(=243)種可能)
然后寫一個判斷累計函數judge()
每生成一個排列就送到judge去判斷一次
如果滿足條件則ok加1
最后給出概率百分數 float percent = ok*100.0/total
//--------------------------------
遞歸的代碼我已經寫好了。通過適當修改相關參數(把方便面袋數量和卡片種類設置為變量提示用戶輸入),可以計算不同方便面袋數和卡片種類數的中獎概率。如果使用循環的話針對這個題需要5重循環,我想你應該會,我就不寫了。
//--------------------------------
放代碼:
//--------------------------------
#include stdio.h
#include conio.h
//----------------------
int f[6],ok,total;
void judge()
{ int card[4]={0},i; //card[]表示是否有第i張卡片
for(i=1;i=5;i++)
card[f[i]]++;
for(i=1;i=3;i++)
if(!card[i]) return;
ok++;
}//-------------------------
void put(int nxi)//往第nxi袋方便面袋里放卡片
{ if(nxi == 6)
{ total++;
judge();
return; //回溯
}
int i;
for(i=1;i=3;i++)
{ f[nxi] = i;
put(nxi+1);//遞歸
}
}//-------------------------
main()
{
float per;
char c = '%';
put(1);
per = 100.0 * ok/total;
printf("概率為:%d/%d\n",ok,total);
printf("百分數: %.2f%c",per,c);
getch();
}//-------------------------
運行結果:
150/243
61.73%
當然,你還可以加一個約分函數使得結果為最簡分數。這里就不再討論了。
我想是因為for (i=1;b=1;i++)這一句無效。
前面b=0,循環條件是b=1,所以不循環的。
另外b=b+0.1*pow(0.9,i-1);這句的0.1后面應該加上f,否則類型不對。
這個是改動過的代碼
#include stdio.h
#include math.h
int main()
{
int i;
long double b;
b=0;
for (i=1;b=1;i++)
{
b=b+0.1f*pow(0.9,i-1);
}
printf("%d\n", i);
return 0;
}
時間有些晚了,答題有點倉促,不知道能不能行,如果出現問題,希望海涵。
計算機里的取隨機數函數是均勻分布的隨機數。
0.0005的概率,相當于2000個數里取一個。
所以我們可以
在0到1999范圍里取隨機數,如果取到數值
1000,我們就得1(并響鈴),否則得0。
#include
stdio.h
#include
stdlib.h
#include
math.h
#include
time.h
void
main()
{
long
int
i,y;
double
x,
r,
M
=
2000.0;
srand((unsigned)time(NULL));
for
(i=0;i5000;i++)
//
取5000個
{
r
=
(
(double)rand()
/
((double)(RAND_MAX)+(double)(1))
);
x
=
(r
*
M);
y
=
(long
int)
x;
if
(y
==
1000)
{
printf("1
");printf("\007");
//
如果得1,就響鈴!
}
else
printf("0
");
};
}
隨機生成一個數倒是可以,概率的話,直接用1除以生成的數就可以了
沒有的
C語言是屬于中級語言
而且不是面向數學計算的語言
不過對于這種功能的函數是可以用C語言自己寫出來的