您好,lianyicq!
没错,无论黑球存在与否,包含红球的洞数可能是1~n的任何数。
无黑球存在时,对应1-n的概率分别为P1—Pn;但黑球存在时,对应1-n的概率分别为p1-pn,但p1-pn与P1-Pn已不再对应相等。
没错,无论黑球存在与否,包含红球的洞数可能是1~n的任何数。
无黑球存在时,对应1-n的概率分别为P1—Pn;但黑球存在时,对应1-n的概率分别为p1-pn,但p1-pn与P1-Pn已不再对应相等。
[此贴子已经被作者于2016-9-6 18:38编辑过]

程序代码:#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
void fun1(int sum[][200]){//更正fun1如下,之前的随机逻辑出错了
int red=200,black=200200;
for(int j=1000; j; j--) {
for(int i=200200; i; i--) {
int flag=rand()*1.0/RAND_MAX*(red+black);
if(flag<red){//随机到了一个红球
sum[j][rand()%200]++;//随机一个洞入洞
red--;
}else black--;
}
// for(int i=0; i<200; i++)printf("%4d",sum[i]);
// printf("\n");
}
}
void fun2(int sum[][200]){
for(int j=1000; j; j--) {
for(int i=200; i; i--) {
int flag=rand()%200;
sum[j-1][flag]++;
}
// for(int i=0; i<200; i++)printf("%4d",sum[i]);
// printf("\n");
}
}
int main() { //我在本地运行超时
srand(time(NULL));
int start=0;
start=clock();
int sum[1000][200]={0};
fun2(sum);
//计算峰值的部分你打算怎么做这个我就不会了。
for(int i=0;i<1000;i++)for(int j=0;j<200;j++)sum[i][j]=0;//重置
fun1(sum);
//计算峰值
int end=clock();
printf("%d",end-start);//计算耗时的一个函数,不过我没想到数据量这么大居然只花了5.6秒就搞定
return 0;
}[此贴子已经被作者于2016-9-7 13:02编辑过]

程序代码:void fun1(int sum[][200]){//更正fun1如下,之前的随机逻辑出错了
int red=200,black=200200;
for(int j=1000; j; j--) {
for(int i=200200; i; i--) {
int flag=rand()*1.0/RAND_MAX*(red+black);//rand()得到一个【0,RAND_MAX】,除于RAND_MAX得到【0,1】的小数乘以剩下的球的总数得到一个随机值
if(flag<red){//如果得到的随机值小于当前红球的剩余数目,则随机到了一个红球
sum[j][rand()%200]++;//再次随找机一个洞 入洞
red--;
}else black--;
}
// for(int i=0; i<200; i++)printf("%4d",sum[i]);
// printf("\n");
}
}[此贴子已经被作者于2016-9-7 13:01编辑过]
