Пример #1
0
		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;
		}
Пример #2
0
		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);
		}