64,654
社区成员
发帖
与我相关
我的任务
分享
/*********************************************************************************
get == 1 //随机取到的是两个黑棋
get == 2 //随机取到的是两个白棋
get == 3 //随机取到的是一个白棋,一个黑棋
Black_Num //初始时袋子中黑棋的个数
White_Num //初始时袋子中白棋的个数
Black //袋子中最后剩下的是黑棋,出现的次数
White //袋子中最后剩下的是白棋,出现的次数
Empty //袋子中最后一个棋都没有剩下
BlackPercent //最后剩下的是黑棋的概率 BlackPercent = Black/(White + Zero + Black)
COUNTTIMES //采取计算100000次
编译环境 gcc version 3.4.4 vim version 7.2
************************************************************************************/
#include <iostream>
#include <iomanip>
#define TRUE 1
#define FALSE 0
#define OK 0
#define COUNTTIMES 100000
typedef float status;
int Count(void);
status Black_Num, Black_Num_Temp, White_Num, White_Num_Temp, Black = 0, Empty = 0, White = 0;
int get, start = TRUE;
using namespace std;
int Count(void)
{
if ( Black_Num == 1&&White_Num == 0 ) /*最后袋子中只剩下一个黑棋*/
{
Black++;
Black_Num = Black_Num_Temp;
White_Num = White_Num_Temp;
start = FALSE;
}
else if ( White_Num == 1&&Black_Num == 0 ) /*最后袋子中只剩下一个白棋*/
{
White++;
Black_Num = Black_Num_Temp;
White_Num = White_Num_Temp;
start = FALSE;
}
else if ( Black_Num == 0&&White_Num == 0 ) /*最后袋子中没有剩棋*/
{
Empty++;
Black_Num = Black_Num_Temp;
White_Num = White_Num_Temp;
start = FALSE;
}
return OK;
}
int main(void)
{
int i;
float BlackPercent = 0.000;
cout << "请输入袋子中白棋个数与黑棋个数中间用空格分开" << endl;
cin >> Black_Num >> White_Num;
Black_Num_Temp = Black_Num;
White_Num_Temp = White_Num;
srand(time(0)); /*初始化随机种子*/
for ( i = 0; i < COUNTTIMES; i++)
{
start = TRUE;
while(start)
{
get = rand() % 3 + 1;
switch( get )
{
case 1:
if ( Black_Num >= 2 )
{
Black_Num = Black_Num - 2; /* 取到两个黑棋,黑棋的个数少2 */
Count();
}
break;
case 2:
if ( White_Num >= 2 )
{
Black_Num = Black_Num + 1; /* 取到两个白棋,白棋个数少2,黑棋个数多1*/
White_Num = White_Num - 2;
Count();
}
break;
case 3:
if ( White_Num >= 1&&Black_Num >= 1 )
{
Black_Num = Black_Num - 1; /* 取到一个黑棋,一个白棋,白棋个数不变,黑棋个数少1 */
Count();
}
break;
default:
break;
}
}
}
BlackPercent = Black/(Black + White + Empty);
cout << showpoint << fixed << setprecision(3); //设置输出的格式保留小数点后三位
cout << "最后剩下的是黑棋出现的次数 = " << Black << endl;
cout << "最后剩下的是白棋出现的次数 = " << White << endl;
cout << "最后一个都不剩出现的次数 = " << Empty << endl;
cout << "最后剩下黑棋的概率 = " << BlackPercent << endl;
return OK;
}
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
bool play(int m, int n);
void main( void )
{
while(true)
{
int m;
printf("input m: ");
scanf("%d",&m);
int n;
printf("input n: ");
scanf("%d",&n);
double success = 0;
const double TESTNUMBER = 10000000;
for(int i = 0; i<TESTNUMBER; i++)
{
if( play(m, n))
success++;
}
printf("%f times is ok in %f times \n", success, TESTNUMBER);
double probability = (double)(success / TESTNUMBER);
printf("probability is : %f\n", probability);
}
}
bool play(int m, int n)
{
srand(time(NULL));
const int M = m;
const int N = n;
while( m + n >= 2 )
{
int i = rand() % (m + n) + 1;
int j = rand() % (m + n) + 1;
while( i == j)
{
j = rand() %(m + n) + 1;
}
if(i <= m && j <= m) //两个黑棋
{
m = m - 2;
}
else if(i >m && j >m) // 两个白棋
{
n = n - 2;
if(m < M)
m = m + 1;
}
else
{
m = m - 1;
}
}
if(m == 1)
{
return true;
}
return false;
}
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
bool WhiteBlack(int m, int n){
if(rand()%(m+n)<m) return 1; //black
else return 0;//white
}
void main(){
srand(time(NULL));
int m0=1,n0,
remnant=0;
do{
remnant=0;
scanf("%d %d",&m0,&n0);
if(m0==0) break;
for(int k=0;k<1000;k++){
int m=m0,n=n0,// 20 white; 10 black
x1,x2;//x1: first lot, x2: second lot
while((m+n)>=2){
x1= WhiteBlack(m,n);
if(x1) m--;
else n--;
x2= WhiteBlack(m,n);
if(x2) m--;
else n--;
if(x1==0 && x2==0) m++;
else if(!(x1&&x2)) n++;
}
if(m==1) remnant++;
}
printf("Probability: %.3f\n",remnant/1000.0);
}while(1);
}