using namespace std;
int main(int argc, char* argv[])
{
const int N=100; // 基础群大小
const int s=4; //公母比例nf/nm
const int n0=8; //每头母畜每胎所产后代数
const double P1=0.16,P2=0.48,P3=0.36; //基因型频率,11,12,22
const int g=20; //考察世代数
int S[N]; // 个体性别(1为雄,2为雌)
int G[N]; //基因型(11,12,22)
double u1,u2;
//产生服从(0,1)之间均匀分布的随机数
//随机数生成算法
boost::mt19937 rng;
//一种浮点数分布算法
boost::uniform_real<> one(0,1);
//得到需要的浮点数生成器,它是一个functor
boost::variate_generator<boost::mt19937&, boost::uniform_real<> > die(rng, one);
// 确定个体性别与基因型
// for (int i=0;i<N;i++)
// {
// u1 = die(); // simulate rolling a die
// if (u1<s/(1+s))
// S[i]=1;
// else
// S[i]=2;
// }
//
// //个体基因型确定(随机法)
// for (int i=0;i<N;i++)
// {
// u2=die();
//
// if (u2<P1)
// G[i]=11;
// else {/*如果代码块是多行,请加上括号*/
// if (u2>=P1&&u2<P1+P2)
// G[i]=12;
// else
// G[i]=22;
// }
// }
//不觉得可以一次循环搞定么?
int nm=0,nf=0;
for (int i=0;i<N;i++)
{
u1 = die(); // simulate rolling a die
if (u1<s/(1+s)) {
S[i]=1;
++nm;
}
else
S[i]=2;
u2=die();
if (u2<P1)
G[i]=11;
else {/*如果代码块是多行,请加上括号*/
if (u2>=P1&&u2<P1+P2)
G[i]=12;
else
G[i]=22;
}
}
nf=N-nm;
// 随机交配,结果记录到二维数组中
// 产生服从U(1,nf)的随机数u,随机挑选母畜
int u;
int M[nm][s]; //存放配对的数组
//不需要重复声明
//boost::mt19937 rng; // produces randomness out of thin air
//需要重新声明一个分布算法 因为field变了
boost::uniform_int<> field(1,nf); // distribution that maps to 1..6
//于是分布算法+随机数算法生成的生成器对象变了,我叫die2
boost::variate_generator<boost::mt19937&, boost::uniform_int<> > die2(rng, field); // glues randomness with mapping
//加上括号
for (int i=1;i<=nm;i++) {
for (int j=1;j<=s;j++)
{
u = die2(); // simulate rolling a die
cout<<u<<endl;
M[i][j]=u;
}
}
return 0;
}