--- a/src/core/random-variable.cc Tue Jun 10 06:08:16 2008 -0700
+++ b/src/core/random-variable.cc Fri Jun 13 17:19:53 2008 -0700
@@ -1043,11 +1043,21 @@
{ // Got good pair
double y = sqrt((-2 * log(w))/w);
m_next = m_mean + v2 * y * sqrt(m_variance);
- if (fabs(m_next) > m_bound) m_next = m_bound * (m_next)/fabs(m_next);
- m_nextValid = true;
+ //if next is in bounds, it is valid
+ m_nextValid = fabs(m_next-m_mean) <= m_bound;
double x1 = m_mean + v1 * y * sqrt(m_variance);
- if (fabs(x1) > m_bound) x1 = m_bound * (x1)/fabs(x1);
- return x1;
+ //if x1 is in bounds, return it
+ if (fabs(x1-m_mean) <= m_bound)
+ {
+ return x1;
+ }
+ //otherwise try and return m_next if it is valid
+ else if (m_nextValid)
+ {
+ m_nextValid = false;
+ return m_next;
+ }
+ //otherwise, just run this loop again
}
}
}
@@ -1094,10 +1104,18 @@
NormalVariable::NormalVariable()
: RandomVariable (NormalVariableImpl ())
{}
+NormalVariable::NormalVariable(double m, double v)
+ : RandomVariable (NormalVariableImpl (m, v))
+{}
NormalVariable::NormalVariable(double m, double v, double b)
: RandomVariable (NormalVariableImpl (m, v, b))
{}
double
+NormalVariable::GetSingleValue(double m, double v)
+{
+ return NormalVariableImpl::GetSingleValue (m, v);
+}
+double
NormalVariable::GetSingleValue(double m, double v, double b)
{
return NormalVariableImpl::GetSingleValue (m, v, b);
--- a/src/core/random-variable.h Tue Jun 10 06:08:16 2008 -0700
+++ b/src/core/random-variable.h Fri Jun 13 17:19:53 2008 -0700
@@ -490,7 +490,6 @@
class NormalVariable : public RandomVariable
{
public:
- static const double INFINITE_VALUE;
/**
* Constructs an normal random variable with a mean
* value of 0 and variance of 1.
@@ -498,19 +497,36 @@
NormalVariable();
/**
+ * \brief Construct a normal random variable with specified mean and variance.
+ * \param m Mean value
+ * \param v Variance
+ */
+ NormalVariable(double m, double v);
+
+ /**
* \brief Construct a normal random variable with specified mean and variance
* \param m Mean value
* \param v Variance
- * \param b Bound. The NormalVariable is bounded within +-bound.
+ * \param b Bound. The NormalVariable is bounded symetrically about the mean
+ * [mean-bound,mean+bound]
*/
- NormalVariable(double m, double v, double b = INFINITE_VALUE);
+ NormalVariable(double m, double v, double b);
+
/**
* \param m Mean value
* \param v Variance
- * \param b Bound. The NormalVariable is bounded within +-bound.
+ * \return A random number from a distribution specified by m, and v.
+ */
+ static double GetSingleValue(double m, double v);
+
+ /**
+ * \param m Mean value
+ * \param v Variance
+ * \param b Bound. The NormalVariable is bounded symetrically about the mean
+ * [mean-bound,mean+bound]
* \return A random number from a distribution specified by m,v, and b.
*/
- static double GetSingleValue(double m, double v, double b = INFINITE_VALUE);
+ static double GetSingleValue(double m, double v, double b);
};
/**