Example #1
0
//=========================================================
//    フラッシュ ( P5  24点 )                              
//=========================================================
int Flush( const int hd[], int cg, int us ){
  int target;                 // 対象とするマーク(SHDC)
  struct card  deck[13] = {0};// 山札の構造体
  double Mark[4] = {0};       // 各マークの出る確率(0=S 1=H 2=D 3=C)
  double hand_pro[5] = {0};   // 各手札のマークの出る確率(1枚目,2枚目,...)
  double min = 1;             // 最小値を格納
  int chng_mark = 0;          // 捨てるマーク
  int sut_max = 0;            // 手持ちカードの最大組のマークを示す
  int ret=0;                  // 交換するカード
  int i, j;                   // 反復変数
  int a, b;                   // 一時変数
  
  if( poker_point(hd) >= P5 ){ return -1; }
  
  for( i=0; i< 4; i++ ){ deck[i].mark = 13-(sut[i] + udsut[i]); }  // (手札と捨て札から)山札のマーク残り数を求める
  
  for( i=0; i<HNUM; i++ ){
    if( CHNG-cg < HNUM-sut[i] || deck[hand[i].mark].mark == 0 ){ // 残りチェンジ数が必要枚数よりも多い場合 か 山札に対象マークカードがない
      hand_pro[i] = 0;
    }else{
      a = Combi( deck[hand[i].mark].mark, HNUM - sut[hand[i].mark] );  // 13C4 など 13枚のうち、5枚に足りない4枚が出る確率を求める
      b = Combi( (52-us-HNUM), HNUM - sut[hand[i].mark] );             // 山札の中から 5枚に足りない4枚が出る確率を求める
      hand_pro[i] = (double)a/b;
    }
  }
  
  for( i=0; i<4; i++ ){       // 手札の中からマークの数が最大の物を探す
    if( sut_max < sut[i] ){
      sut_max = sut[i];
      target = i;
    }
  }

  if( sut[target] == 2 || sut[target] == 3 || sut[target] == 4 ){  // 既に出来ているペアは(確率を最大にして)崩さない
    for( j=0; j<HNUM; j++ ){
      if( hand[j].mark == target ){
        hand_pro[j] = 1.0;
      }
    }
  }

  for( i=0; i<HNUM; i++ ){  // 出る確率の低いマークを探す
    if( hand_pro[i] < min ){ min = hand_pro[i]; chng_mark = i; }
  }
  ret = chng_mark;

  return ret;
}
Example #2
0
/*Calleuro_n*/
static double Call_euro_n(double S, double K, double T, double r, double divid, double sigma,int n)
{
  double d=ap_carr_D(divid,T,n);
  double epsilon=ap_carr_epsilon(r,divid,sigma,T,n);
  double gamma_carr=ap_carr_gamma(r,divid,sigma);
  double R1=ap_carr_R(r,T,n);
  double q1=ap_carr_q(r,divid,sigma,T,n);
  double p1=ap_carr_p(r,divid,sigma,T,n);
  double q_1=ap_carr_qhat(r,divid,sigma,T,n);
  double p_1=ap_carr_phat(r,divid,sigma,T,n);
  double S1,S2;
  int k,l;

  if (S>K)
    {
      return S*pow_int(d,n)-K*pow_int(R1,n)+Put_euro_n(S,K,T,r,divid,sigma,n);
    } else {
    S1=0;
    for (k=0;k<=n-1;k++)
      {
	S2=0;
	for(l=0;l<=n-k-1;l++)
	  {
	    S2+=Combi(n-1+l,n-1)*(K*pow_int(d,n)*pow_int(q_1,k+l)*pow_int(p_1,n)-K*pow_int(R1,n)*pow_int(q1,k+l)*pow_int(p1,n));
	  }
	S1+=(pow_int(2*epsilon*log(K/S),k)/Factor(k))*S2;
      }
    return pow(S/K,gamma_carr+epsilon)*S1;
  }
}
Example #3
0
/*b*/
static double ap_carr_b(int i,int n,double S,double K,double T,double r,double divid,double sigma,double s[10])
{
  int j,k,l;
  double S1,S2,S3;
  double d=ap_carr_D(divid,T,n);
  double epsilon=ap_carr_epsilon(r,divid,sigma,T,n);
  double gamma_carr=ap_carr_gamma(r,divid,sigma);
  double delta=ap_carr_delta(T,n);
  double R1=ap_carr_R(r,T,n);
  double q1=ap_carr_q(r,divid,sigma,T,n);
  double p1=ap_carr_p(r,divid,sigma,T,n);
  double q_1=ap_carr_qhat(r,divid,sigma,T,n);
  double p_1=ap_carr_phat(r,divid,sigma,T,n);
  
  S1=0.;
  for(j=1;j<=n-i+1;j++)
    {
      S2=0.;
      for(k=0;k<=j-1;k++)
	{
	  S3=0.;
	  for(l=0;l<=j-k-1;l++)
	    {
	      S3+=Combi(j-1+l,j-1)*(pow_int(q1*R1,j)*pow_int(p1,k+l)*K*r-pow_int(q_1*d,j)*pow_int(p_1,k+l)*s[n-j+1]*divid)*delta;
							
							
	    }
	  S2+=(pow_int(2*epsilon*log(S/s[n-j+1]),k)/Factor(k))*S3;
	}
      S1+=pow(S/s[n-j+1],gamma_carr-epsilon)*S2;
			
    }
  
  return S1;
}
std::vector<std::vector<long>> Product( int size )
{//产生杨辉三角数据
	std::vector<std::vector<long>> db;

	for (int i=0;i<=size;++i)
	{
		int tag=0;
		std::vector<long> temp(i+1,0);
		std::generate(temp.begin(),temp.end(),[&tag,i]()
		{
			return Combi(i,tag++);
		});
		db.push_back(temp);
	}

	return db;
}