/// <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); }
/// <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); }