Fix random for custom scalars that don't have constexpr digits().
diff --git a/Eigen/src/Core/MathFunctions.h b/Eigen/src/Core/MathFunctions.h
index 75f8e53..c92572f 100644
--- a/Eigen/src/Core/MathFunctions.h
+++ b/Eigen/src/Core/MathFunctions.h
@@ -797,25 +797,33 @@
 template <typename Scalar>
 struct random_default_impl<Scalar, false, false> {
   using BitsType = typename numext::get_integer_by_size<sizeof(Scalar)>::unsigned_type;
-  enum : int { MantissaBits = NumTraits<Scalar>::digits() - 1 };
-  static EIGEN_DEVICE_FUNC inline Scalar run(const Scalar& x, const Scalar& y, int numRandomBits = MantissaBits) {
+  static EIGEN_DEVICE_FUNC inline Scalar run(const Scalar& x, const Scalar& y, int numRandomBits) {
     Scalar half_x = Scalar(0.5) * x;
     Scalar half_y = Scalar(0.5) * y;
     Scalar result = (half_x + half_y) + (half_y - half_x) * run(numRandomBits);
     // result is in the half-open interval [x, y) -- provided that x < y
     return result;
   }
-  static EIGEN_DEVICE_FUNC inline Scalar run(int numRandomBits = MantissaBits) {
-    eigen_assert(numRandomBits >= 0 && numRandomBits <= MantissaBits);
+  static EIGEN_DEVICE_FUNC inline Scalar run(const Scalar& x, const Scalar& y) {
+    const int mantissa_bits = NumTraits<Scalar>::digits() - 1;
+    return run(x, y, mantissa_bits);
+  }
+  static EIGEN_DEVICE_FUNC inline Scalar run(int numRandomBits) {
+    const int mantissa_bits = NumTraits<Scalar>::digits() - 1;
+    eigen_assert(numRandomBits >= 0 && numRandomBits <= mantissa_bits);
     BitsType randomBits = getRandomBits<BitsType>(numRandomBits);
     // if fewer than MantissaBits is requested, shift them to the left
-    randomBits <<= (MantissaBits - numRandomBits);
+    randomBits <<= (mantissa_bits - numRandomBits);
     // randomBits is in the half-open interval [2,4)
     randomBits |= numext::bit_cast<BitsType>(Scalar(2));
     // result is in the half-open interval [-1,1)
     Scalar result = numext::bit_cast<Scalar>(randomBits) - Scalar(3);
     return result;
   }
+  static EIGEN_DEVICE_FUNC inline Scalar run() {
+    const int mantissa_bits = NumTraits<Scalar>::digits() - 1;
+    return run(mantissa_bits);
+  }
 };
 
 // TODO: fix this for PPC