概率的问题:使用递归与多次试验模拟的分析

多次枚举:

实例1

口袋中有5只红球,4只白球。随机从口袋中取出3个球,取出1个红球2个白球的概率


代码如下:

<SPAN style="FONT-SIZE: 18px"> srand( (unsigned)time( NULL ) );
 int n = 0;
 for(int i=0; i<100000; i++)
 {
  char x[] = {1, 1, 1, 1, 1, 2, 2, 2, 2};//5个红球用5个1表示 4个白球用4个2表示
  int a = 0;  // 取到的红球的数目
  int b = 0;  // 取到的白球的数目

for(int j=0; j<3; j++)  //取3个球进行3次循环
  {
   int k = rand() % (9-j);  //下标的确定  确定范围  9-j 是重点
   if(x[k]==1)
    a++;
   else
    b++;

x[k] = x[9-j-1]; //将取出数向后移动
  }
  if(a==1 && b==2)  n++;//取出1个红球2个白球时进行计数
 }
 printf("概率=%f\n", n/100000.0*100);</SPAN>

实例2


代码如下:

<SPAN style="FONT-SIZE: 18px">#define N 30
......
 int a[N];
 srand( time( NULL ) );
 int n = 0;
 for(int k=0; k<10000; k++)
 {
  for(int i=0; i<N; i++)
   a[i] = rand() % 365;
  bool tag = false; // 假设没有相同
  for(i=1; i<N; i++)
  {
   for(int j=0; j<i; j++)
   {
    if(a[i]==a[j])
    {
     tag = true;
     break;
    }
   }
   if(tag) break;
  }
  if(tag) n++;
 }
 printf("%f\n", 1.0 * n / 10000 * 100);
</SPAN>

递归:

某个袋子中有红球m个,白球n个。现在要从中取出x个球。红球数目多于白球的概率

下面的代码解决了这个问题。其中的y表示红球至少出现的次数。

这与前文的问题是等价的。因为如果取30个球,要求红球数大于白球数,则等价于至少取出16个红球。


代码如下:

<SPAN style="FONT-SIZE: 18px">/*
   m: 袋中红球的数目
   n: 袋中白球的数目
   x: 需要取出的数目
   y: 红球至少出现的次数
*/

double pro(int m, int n, int x, int y)
{
 if(y>x) return 0;
 if(y==0) return 1;  //对y没有要求
 if(y>m) return 0;
 if(x-n>y) return 1;  //把白球全部取出,剩下就是红球 红球比至少取出还多,概率为1
 double p1 = pro(m-1,n,x-1,y-1) ; 
 double p2 = pro(m,n-1,x-1,y);
 return (double)m/(m+n) * p1 + (double)n/(m+n) * p2;
}</SPAN>

(0)

相关推荐

  • 概率的问题:使用递归与多次试验模拟的分析

    多次枚举: 实例1 口袋中有5只红球,4只白球.随机从口袋中取出3个球,取出1个红球2个白球的概率 复制代码 代码如下: <SPAN style="FONT-SIZE: 18px"> srand( (unsigned)time( NULL ) ); int n = 0; for(int i=0; i<100000; i++) {  char x[] = {1, 1, 1, 1, 1, 2, 2, 2, 2};//5个红球用5个1表示 4个白球用4个2表示  int a

  • JS基于递归实现网页版计算器的方法分析

    本文实例讲述了JS基于递归实现网页版计算器的方法.分享给大家供大家参考,具体如下: 递归实现网页版计算器可以简化代码,设计思路: 1.css+html实现计算器的外观,给每个button绑定number(z)事件,传入z的不同来区分触发事件的按钮. <style>放入head中 这个div放在body中,是计算器的html,number()通过传入不同的数字,区分触发按钮. <div class="bg"> <div id="txt"&

  • PHP 递归效率分析

    而且是差了3倍的效率.所以,PHP中的递归一定要小心的对待. 最近写了一个快速排序的算法,发现PHP中的递归效率不能一刀切,在各种不同的服务器中,可能会表现不一样. 复制代码 代码如下: function qsort(&$arr) { _quick_sort($arr, 0, count($arr) - 1); } /** * 采用递归算法的快速排序. * * @param array $arr 要排序的数组 * @param int $low 最低的排序子段 * @param int $hig

  • C语言 Freertos的递归锁详解

    目录 1.死锁的概念 2.自我死锁 3.递归锁 4.代码 5.运行流程分析 6.运行结果 总结 1.死锁的概念 假设有 2 个互斥量 M1. M2, 2 个任务 A. B: A 获得了互斥量 M1 B 获得了互斥量 M2 A 还要获得互斥量 M2 才能运行,结果 A 阻塞 B 还要获得互斥量 M1 才能运行,结果 B 阻塞 A. B 都阻塞,再无法释放它们持有的互斥量 死锁发生! 2.自我死锁 任务 A 获得了互斥锁 M 它调用一个函数 函数要去获取同一个互斥锁 M,于是它阻塞:任务 A 休眠,

  • Java 精炼解读递归的概念与使用

    目录 一.递归的概念 1.什么是递归? 2.递归讲解 二.递归的使用  总结: 一.递归的概念 1.什么是递归? 递归就是:方法自己调用方法的过程. 使用递归有两个前提条件: 1.有一个趋近与终止的条件. 2.自己调用自己 . 如何实现递归? 最重要的方式是:实现递归,需要去推导出一个递推公式. 思考递归的方式:横向思考,根据递推公式来思考. 代码的执行:是纵向执行. 2.递归讲解 首先看下面代码: public class TestDemo { public static void func(

  • 详解基于C++实现约瑟夫环问题的三种解法

    目录 一.前言 二.循环链表模拟 三.有序集合模拟 四.递归公式解决 五.结语 一.前言 什么是约瑟夫环问题? 约瑟夫环问题在不同平台被"优化"描述的不一样,例如在牛客剑指offer叫孩子们的游戏,还有叫杀人游戏,点名--最直接的感觉还是力扣上剑指offer62的描述:圆圈中最后剩下的数字. 问题描述: 0,1,···,n-1这n个数字排成一个圆圈,从数字0开始,每次从这个圆圈里删除第m个数字(删除后从下一个数字开始计数).求出这个圆圈里剩下的最后一个数字. 例如,0.1.2.3.4这

  • javascript 可控式透明特效实现代码

    空间就全凭CSS的绝对定位实现位移了.在开始之前,我们练习一下setTimeout的递归用法(用来模拟setInterval). 复制代码 代码如下: function text(el){ var node = (typeof el == "string")? document.getElementById(el) : el; var i = 0; var repeat = function(){ setTimeout(function(){ node.innerHTML = &quo

  • PHP基于迭代实现文件夹复制、删除、查看大小等操作的方法

    本文实例讲述了PHP基于迭代实现文件夹复制.删除.查看大小等操作的方法.分享给大家供大家参考,具体如下: 前面一篇 PHP递归实现文件夹的复制.删除.查看大小操作 分析了递归操作使用技巧,这里再来分析一下迭代的操作技巧. "既然递归能很好的解决,为什么还要用迭代呢"?主要的原因还是效率问题-- 递归的概念是函数调用自身,把一个复杂的问题分解成与其相似的多个子问题来解决,可以极大的减少代码量,使得程序看起来非常优雅. 由于系统要为每次函数调用分配运行空间,并使用压栈予以记录.在函数调用结

  • 使用VC6.0对C语言程序进行调试的基本手段分享

    (1)设置固定断点或临时断点 所谓断点,是指定程序中的某一行,让程序运行至该行后暂停运行,使得程序员可以观察分析程序的运行过程中的情况.这些情况一般包括: ①在变量窗口(Varibles)中观察程序中变量的当前值.程序员观察这些值的目的是与预期值对比,若与预期值不一致,则此断点前运行的程序肯定在某个地方有问题,以此可缩小故障范围.例如以下程序是计算cos(x)并显示,运行时发现无论x输入为多少,结果都是0.046414. 复制代码 代码如下: #include <stdio.h>#includ

  • C语言 解决不用+、-、×、÷数字运算符做加法的实现方法

    题目:写一个函数,求两个整数的之和,要求在函数体内不得使用+.-.×.÷. 分析:这又是一道考察发散思维的很有意思的题目.当我们习以为常的东西被限制使用的时候,如何突破常规去思考,就是解决这个问题的关键所在. 看到的这个题目,我的第一反应是傻眼了,四则运算都不能用,那还能用什么啊?可是问题总是要解决的,只能打开思路去思考各种可能性.首先我们可以分析人们是如何做十进制的加法的,比如是如何得出5+17=22这个结果的.实际上,我们可以分成三步的:第一步只做各位相加不进位,此时相加的结果是12(个位数

随机推荐