重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
这是典型的古典概型,直接用穷举法计算即可。
创新互联建站主营米林网站建设的网络公司,主营网站建设方案,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语言自己写出来的