/** * Generates a random number in the provided range, where all possible values are equally likely. (Even distribution.) * * NOTE: If $max is more than PHP_INT_MAX or $min is less than PHP_INT_MIN, no additional entropy will be gained for * the random number, and the distribution will become less evenly distributed across all possible values due to * rounding. * * @param $min * @param $max * @return NumberInterface */ public function random($min = 0, $max = PHP_INT_MAX) { $min = Numbers::makeOrDont(Numbers::IMMUTABLE, $min); $max = Numbers::makeOrDont(Numbers::IMMUTABLE, $max); $difference = new ImmutableNumber(BCProvider::add($max->absValue(), $min->absValue())); $randFactory = new Factory(); if ($max->compare(PHP_INT_MAX) != 1 && $min->compare(PHP_INT_MIN) != -1 && $difference->compare(PHP_INT_MAX) != 1) { $x = $randFactory->getMediumStrengthGenerator()->generateInt($min, $max); return Numbers::makeFromBase10($this->numberType, $x, null, $this->contextBase); } else { $x = $randFactory->getMediumStrengthGenerator()->generateInt(); $fraction = BCProvider::divide($x, PHP_INT_MAX); $addedValue = BCProvider::multiply($fraction, $difference->getValue()); $randVal = Numbers::makeFromBase10($this->numberType, BCProvider::add($min->getValue(), $addedValue), null, $this->contextBase); return $randVal->round(); } }
public function PDFByValue($value) { $value = Numbers::makeOrDont($this->numberType, $value); return Numbers::make($this->numberType, BCProvider::multiply(BCProvider::divide(1, BCProvider::multiply($this->standardDev->getValue(), BCProvider::squareRoot(M_2_PI))), BCProvider::exp(M_E, BCProvider::multiply(-1, BCProvider::divide(BCProvider::exp(BCProvider::subtract($value->getValue(), $this->mean->getValue()), 2), BCProvider::multiply(2, $this->variance->getValue()))))), $value->getPrecision(), $value->getBase()); }
/** * @param NumberInterface|int|float|string $value * @return int */ public function compare($value) { $value = Numbers::makeOrDont($this, $value, $this->getPrecision()); if ($this->getBase() != 10) { $thisValue = $this->convertToBase(10)->getValue(); } else { $thisValue = $this->getValue(); } if ($value->getBase() != 10) { $thatValue = $value->convertToBase(10)->getValue(); } else { $thatValue = $value->getValue(); } $scale = $this->getPrecision() < $value->getPrecision() ? $this->getPrecision() : $value->getPrecision(); return BCProvider::compare($thisValue, $thatValue, $scale); }