public ExcitingRandom(double[] pdf) { int count = pdf.Length - 1; mCdf = new List<CurveSegment>(count); double overN = 1.0 / count; // 확률 총합이 1이 되도록 normalizing factor를 계산한다. double totalArea = 0.0f; for( int i = 1; i < count; i++ ) totalArea += pdf[i]; totalArea += (pdf[0] + pdf[count]) * 0.5; totalArea *= overN; double nf = 1.0 / totalArea; // 각 구간에 대한 cdf를 계산한다. double prevArea = 0.0; for( int i = 0; i < count; i++ ) { var curve = new CurveSegment(i * overN, pdf[i] * nf, (i + 1) * overN, pdf[i + 1] * nf, prevArea); if( curve.a == 0 && curve.b == 0 ) { // 확률이 0인 구간은 샘플링 되지 않도록 한다. continue; } mCdf.Add(curve); prevArea = curve.totalArea; } mCdf[mCdf.Count - 1].totalArea = 1.0f; }
private void Init(double[] pdf) { int count = pdf.Length - 1; mCdf = new List<CurveSegment>(count); double dx = 1.0 / count; // 확률 총합이 1이 되도록 normalizing factor를 계산한다. double totalArea = 0.0f; for( int i = 1; i < count; i++ ) totalArea += pdf[i]; totalArea += (pdf[0] + pdf[count]) * 0.5; totalArea *= dx; double nf = 1.0 / totalArea; NormalizationFactor = nf; // 각 구간에 대한 cdf를 계산한다. double prevArea = 0.0; for( int i = 0; i < count; i++ ) { var curve = new CurveSegment(i * dx, pdf[i] * nf, (i + 1) * dx, pdf[i + 1] * nf, prevArea); if( curve.a == 0 && curve.b == 0 ) { // 확률이 0인 구간은 샘플링 되지 않도록 한다. continue; } mCdf.Add(curve); prevArea = curve.accumArea; } mCdf[mCdf.Count - 1].accumArea = 1.0f; Mean = CalculateMean(pdf); }