Стандартное z-значение Нормального распределения функционирует в C#

Мне нравится сохранять эту опцию выключенной (особенно при работе с большим проектом), но полезно быть в состоянии найти файл в дереве время от времени. Я нашел способ сделать это здесь .

я надеюсь, что не являюсь слишком подробным здесь, но здесь являюсь руководством по созданию этой работы, которую я записал для Wiki своей работы:

  1. Переходят к Инструментам-> Макросы-> Макро-Проводник.
  2. В Макро-дереве Проводника, которое подходит, щелкните правой кнопкой по MyMacros, и затем Новому Модулю....
  3. Вызов новый модуль SyncItem (если Вы хотите).
  4. Щелкают правой кнопкой по новому модулю, затем Редактирование.
  5. Вставка это в окно кода. (Я не знаю или забочусь, необходимы ли строки Импорта; они просто там по умолчанию.)

код:

Imports System
Imports EnvDTE
Imports EnvDTE80
Imports EnvDTE90
Imports System.Diagnostics

Public Module SyncItem

    Sub SyncSolutionExplorer()
        DTE.ExecuteCommand("View.TrackActivityinSolutionExplorer")
        DTE.ExecuteCommand("View.TrackActivityinSolutionExplorer")
    End Sub

End Module

макрос является самым полезным при привязке его с нажатием клавиши. Вот то, как сделать это:

  1. Переходят к Инструментам-> Опции, затем избранная Среда-> Клавиатура.
  2. Находят новый макрос в списке (начните вводить "syncitem" или подобный в поле поиска).
  3. я выбираю Высокий звук - Сдвиг - T (который этому диалоговому окну нравится называть Сдвигом - Высоким звуком - T ) для, гм, "Дерево", я предполагаю? Если Вы - поклонник Edit.LineTranspose лет, независимо от того, что это (я думаю, что это подкачивает текущую строку со следующей), то Вы хотели бы выбирать различный ярлык.

18
задан Lukasz 2 November 2009 в 18:46
поделиться

3 ответа

Вот код для нормального распределения, написанный на Python, но его можно легко перевести на C #, добавив некоторые знаки препинания. Это всего около 15 строк кода.

16
ответ дан 30 November 2019 в 07:55
поделиться

Найдите реализации функции ошибок . Был один из всех классических числовых рецептов в ... книги.

2
ответ дан 30 November 2019 в 07:55
поделиться

Вот перевод C # нормального квантиля C-кода , используемого в программе статистики R .

/// <summary>
/// Quantile function (Inverse CDF) for the normal distribution.
/// </summary>
/// <param name="p">Probability.</param>
/// <param name="mu">Mean of normal distribution.</param>
/// <param name="sigma">Standard deviation of normal distribution.</param>
/// <param name="lower_tail">If true, probability is P[X <= x], otherwise P[X > x].</param>
/// <param name="log_p">If true, probabilities are given as log(p).</param>
/// <returns>P[X <= x] where x ~ N(mu,sigma^2)</returns>
/// <remarks>See https://svn.r-project.org/R/trunk/src/nmath/qnorm.c</remarks>
public static double QNorm(double p, double mu, double sigma, bool lower_tail, bool log_p)
{
  if (double.IsNaN(p) || double.IsNaN(mu) || double.IsNaN(sigma)) return (p + mu + sigma);
  double ans;
  bool isBoundaryCase = R_Q_P01_boundaries(p, double.NegativeInfinity, double.PositiveInfinity, lower_tail, log_p, out ans);
  if (isBoundaryCase) return (ans);
  if (sigma < 0) return (double.NaN);
  if (sigma == 0) return (mu);

  double p_ = R_DT_qIv(p, lower_tail, log_p);
  double q = p_ - 0.5;
  double r, val;

  if (Math.Abs(q) <= 0.425)  // 0.075 <= p <= 0.925
  {
    r = .180625 - q * q;
    val = q * (((((((r * 2509.0809287301226727 +
               33430.575583588128105) * r + 67265.770927008700853) * r +
             45921.953931549871457) * r + 13731.693765509461125) * r +
           1971.5909503065514427) * r + 133.14166789178437745) * r +
         3.387132872796366608)
    / (((((((r * 5226.495278852854561 +
             28729.085735721942674) * r + 39307.89580009271061) * r +
           21213.794301586595867) * r + 5394.1960214247511077) * r +
         687.1870074920579083) * r + 42.313330701600911252) * r + 1.0);
  }
  else
  {
    r = q > 0 ? R_DT_CIv(p, lower_tail, log_p) : p_;
    r = Math.Sqrt(-((log_p && ((lower_tail && q <= 0) || (!lower_tail && q > 0))) ? p : Math.Log(r)));

    if (r <= 5)              // <==> min(p,1-p) >= exp(-25) ~= 1.3888e-11
    {
      r -= 1.6;
      val = (((((((r * 7.7454501427834140764e-4 +
              .0227238449892691845833) * r + .24178072517745061177) *
            r + 1.27045825245236838258) * r +
           3.64784832476320460504) * r + 5.7694972214606914055) *
         r + 4.6303378461565452959) * r +
        1.42343711074968357734)
       / (((((((r *
                1.05075007164441684324e-9 + 5.475938084995344946e-4) *
               r + .0151986665636164571966) * r +
              .14810397642748007459) * r + .68976733498510000455) *
            r + 1.6763848301838038494) * r +
           2.05319162663775882187) * r + 1.0);
    }
    else                     // very close to  0 or 1 
    {
      r -= 5.0;
      val = (((((((r * 2.01033439929228813265e-7 +
              2.71155556874348757815e-5) * r +
             .0012426609473880784386) * r + .026532189526576123093) *
           r + .29656057182850489123) * r +
          1.7848265399172913358) * r + 5.4637849111641143699) *
        r + 6.6579046435011037772)
       / (((((((r *
                2.04426310338993978564e-15 + 1.4215117583164458887e-7) *
               r + 1.8463183175100546818e-5) * r +
              7.868691311456132591e-4) * r + .0148753612908506148525)
            * r + .13692988092273580531) * r +
           .59983220655588793769) * r + 1.0);
    }
    if (q < 0.0) val = -val;
  }

  return (mu + sigma * val);
}

Некоторые вспомогательные методы:

private static bool R_Q_P01_boundaries(double p, double _LEFT_, double _RIGHT_, bool lower_tail, bool log_p, out double ans)
{
  if (log_p)
  {
    if (p > 0.0)
    {
      ans = double.NaN;
      return (true);
    }
    if (p == 0.0)
    {
      ans = lower_tail ? _RIGHT_ : _LEFT_;
      return (true);
    }
    if (p == double.NegativeInfinity)
    {
      ans = lower_tail ? _LEFT_ : _RIGHT_;
      return (true);
    }
  }
  else
  {
    if (p < 0.0 || p > 1.0)
    {
      ans = double.NaN;
      return (true);
    }
    if (p == 0.0)
    {
      ans = lower_tail ? _LEFT_ : _RIGHT_;
      return (true);
    }
    if (p == 1.0)
    {
      ans = lower_tail ? _RIGHT_ : _LEFT_;
      return (true);
    }
  }
  ans = double.NaN;
  return (false);
}

private static double R_DT_qIv(double p, bool lower_tail, bool log_p)
{
  return (log_p ? (lower_tail ? Math.Exp(p) : -ExpM1(p)) : R_D_Lval(p, lower_tail));
}

private static double R_DT_CIv(double p, bool lower_tail, bool log_p)
{
  return (log_p ? (lower_tail ? -ExpM1(p) : Math.Exp(p)) : R_D_Cval(p, lower_tail));
}

private static double R_D_Lval(double p, bool lower_tail) 
{
  return lower_tail ? p : 0.5 - p + 0.5; 
} 

private static double R_D_Cval(double p, bool lower_tail) 
{ 
  return lower_tail ? 0.5 - p + 0.5 : p;
}
private static double ExpM1(double x) 
{
  if (Math.Abs(x) < 1e-5)
     return x + 0.5 * x * x;
  else
     return Math.Exp(x) - 1.0;
 }

В вашем случае вы хотите, чтобы mu = 0.0, sigma = 1.0, lower_tail = true, log_p = false.

11
ответ дан 30 November 2019 в 07:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: