#include <iostream> #include <numeric> #include <vector> #include <cstdlib> #include <fstream> #include <ctime> //很好先stl后其他library #include <boost/random/linear_congruential.hpp> #include <boost/random/uniform_int.hpp> #include <boost/random/uniform_real.hpp> #include <boost/random/variate_generator.hpp> #include <boost/random/mersenne_twister.hpp> 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; }