数学作业有一个关于数豆子的实验,要求出豆子总数。具体来说,是在所有豆子中选择 m 个豆子做标记,然后打乱后随便挑选 p 个,若有标记的为 n 个,则豆子总数 x 约等于 nmp。
但令人费解的是,如果用程序模拟,然后对于每次求出的 x 取平均数,输出的答案并非是真实的 x,而是比 x 稍微大一点。
这是我的程序:
#include<bits/stdc++.h>
using namespace std;
const int x=1000/*总个数*/,m=120/*标记个数*/,p=100/*每次取出来多少*/,times=100000/*取多少次*/;
int a[100010];
void rand_shuffle()
{
for(int i=2; i<=x+m; ++i) swap(a[i],a[rand()%(i-1)+1]);
}
int main()
{
srand(time(0));
double ans=0;
for(int i=1; i<=x-m; ++i) a[i]=1;
for(int i=x-m+1; i<=x; ++i) a[i]=2;
for(int i=1; i<=times; ++i)
{
random_shuffle(a+1,a+x+1);
//rand_shuffle();
int aa=0; // 标记的有多少个
for(int j=1; j<=p; ++j) aa+=(a[j]==2);
ans+=m*p/aa;
}
ans/=times;
cout<<ans;
return 0;
}
上面这个程序输出约为 1079。
有的时候程序没有输出,是因为 aa=0,此时除法会有问题。我猜想问题应该就出在 aa=0 上,如果没有 aa=0,则答案会偏小(因为在 aa=0 时按理来说答案应当特别大,没有说明会小点),但输出却更大了。不理解。