>>18
レスありがとうございます
実は有効牌候補判定はそのサイトにあるプログラムの向聴数判定関数だけインデックス形式に置き換えたものを使ってます
捨て牌候補判定は14枚のときと1枚除いた13枚のときで向聴数が同じ牌を候補とするようにしてます(毎回14回向聴数評価関数が呼び出される)
自分ではこの部分はこれ以上の効率化が思いつかないです。

期待値はhttp://mahjong.ara3.net/hmr/expect3.htmを参考にしました
ある有効牌の期待値ですが排反事象なので、ツモれる確率*前回までツモれなかった確率*期待値のようにしてます

期待値計算の一部(total_mati 有効牌の合計枚数 yama 残りの山の数)
for (int k=0;k < 18-turn;k++)
  {
    //次のツモで有効牌が引ける確率
    exp1 = (double)mati / (double)(yama - k);
    //前回のツモまで有効牌が引けない確率
    if (k>0) {
      //分子 最初の残りの山(yama)-経過した巡目(k)-待ち枚数合計(total_mati)+1(前回の巡目での事象)
      //分母 最初の残りの山(yama)-経過した巡目(k)+1(前回の巡目での事象)
      exp2 *= ( (double)( yama - k - total_mati + 1 ) / (double)( yama - k + 1 ) );
    }
    //17巡目以下のときはシャンテン数を落として同様に計算
    if (k < 18-turn)
    {
      //元の巡目(turn)+有効牌を引くのにかかった巡目(k)+1(次の巡目)
      exp3 = Expectation (turn+k+1,syanten-1);
    }
    total_exp += exp1*exp2*exp3;
  }
このExpectation (turn+k+1,syanten-1)の部分なんですが第一引数だけが異なるだけで殆ど同じ処理を何回も呼び出しているので
この部分がなんとかならないかと思ってるんですが、どなたかなにか案があればお願いします。