Example #1
0
        /// <summary>
        /// 乱数を生成する
        /// 標準偏差 1
        /// </summary>
        /// <returns></returns>
        public decimal NextDecimal()
        {
retry_point:

            decimal u1 = ud1.NextDecimal();
            decimal u2 = ud2.NextDecimal();

            decimal v = u1 * u1 + u2 * u2;

            if (v <= 0 || 1 <= v)
            {
                goto retry_point;
            }

            decimal w = Taylor_Series_Decimal.Square_Root(-2 * Taylor_Series_Decimal.Natural_Logarithm(v) / v);

            decimal y1 = u1 * w;
            decimal y2 = u2 * w;

            if (even)
            {
                result_decimal = y1;
                even           = false;
            }
            else
            {
                result_decimal = y2;
                even           = true;
            }

            return(result_decimal);
        }
Example #2
0
        /// <summary>
        /// 乱数を生成する
        /// 平均値 average
        /// 標準偏差 std
        /// </summary>
        /// <param name="average"></param>
        /// <param name="std"></param>
        /// <returns></returns>
        public decimal NextDecimal(decimal average, decimal std)
        {
retry_point:

            decimal u1 = ud1.NextDecimal();
            decimal u2 = ud2.NextDecimal();

            decimal v1 = 2 * u1 - 1;
            decimal v2 = 2 * u2 - 1;
            decimal v  = v1 * v1 + v2 * v2;

            if (v <= 0 || 1 <= v)
            {
                goto retry_point;
            }

            decimal w = Taylor_Series_Decimal.Square_Root(-2 * Taylor_Series_Decimal.Natural_Logarithm(v) / v);

            decimal y1 = v1 * w;
            decimal y2 = v2 * w;


            if (even)
            {
                result_decimal = y1;
                even           = false;
            }
            else
            {
                result_decimal = y2;
                even           = true;
            }

            result_decimal = Taylor_Series_Decimal.Exponential(result_decimal * Math.Abs(std) + average);
            return(result_decimal);
        }