2023-11-01 23:42来源:m.sf1369.com作者:宇宇
呵呵。大家的好像都很专业。如果我没记错,这是一个高考数学题,你应该是个高中生吧。
可以用深度优先搜索(递归回溯),这样比较简单。
大致的思路是这样
用一个数组 f[6],f[1]~f[5]代表那5袋方便面。
用递归或者循环的方法生成123 放到这5个位置(就是穷举这total(=243)种可能)
然后写一个判断累计函数judge()
每生成一个排列就送到judge去判断一次
如果满足条件则ok加1
最后给出概率百分数 float percent = ok*100.0/total
//--------------------------------
递归的代码我已经写好了。通过适当修改相关参数(把方便面袋数量和卡片种类设置为变量提示用户输入),可以计算不同方便面袋数和卡片种类数的中奖概率。如果使用循环的话针对这个题需要5重循环,我想你应该会,我就不写了。
//--------------------------------
放代码:
//--------------------------------
#include #include //---------------------- 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% 当然,你还可以加一个约分函数使得结果为最简分数。这里就不再讨论了。
数据不全啊. 另外, A~O的概率密度先算出来, 像1~9那样的格式就行了
然后从概率密度换算到分布率, 再用C随机就可以了
具体代码如下: #include #include #include //用到了time函数 int main() { int i,number; srand((unsigned) time(NULL)); //用时间做种,每次产生随机数不一样 for (i=0; i
基本想法:
2维取数
y 向 为 概率
x 向 为 0 - 9:
输出 落入xy 条形区的点子。
#include <stdio.h>
#include <stdlib.h>
void main(void)
{
float y[]={0.07,0.14,0.07,0.14,0.10,0.10,0.80,0.90,0.13, 0.80};
float s;
int i,j,k;
float rd_y;
int rd;
double r;
srand((unsigned)time(NULL));
s=y[0];
for(i=0;i<10;i++) if (y[i] > s) s = y[i];
for (i=0;i<100;i++)
{
r = ( (double)rand() / ((double)(RAND_MAX)+(double)(1)) );
rd_y = r * s;
r = ( (double)rand() / ((double)(RAND_MAX)+(double)(1)) );
rd = (int) (r * 10.0);
if (rd_y <= y[rd]) printf(%d\n,rd);
};
exit(0);
}
rd_y 的计算,请你核对一下,范围是不是 0 到 0.9
我没有精确核对。
#include #include void main() { int r,p; char buf; printf(请输入概率:(举例:概率10%,输10)\n); scanf(%d,&p); scanf(%c,&buf); while(1) { r=rand()%10*10/p; if(r==0) { printf(恭喜中奖!); } else { printf(不中奖!); } printf(\n); printf(按回车键继续!\n); scanf(%c,&buf); if(buf!='\n') break; } }