diff --git a/include/random b/include/random
index 423eaac..3dbf808 100644
--- a/include/random
+++ b/include/random
@@ -5922,10 +5922,9 @@
 
     class _LIBCPP_VISIBLE param_type
     {
-        typedef typename common_type<double, result_type>::type __area_type;
         vector<result_type> __b_;
-        vector<double> __densities_;
-        vector<__area_type> __areas_;
+        vector<result_type> __densities_;
+        vector<result_type> __areas_;
     public:
         typedef piecewise_constant_distribution distribution_type;
 
@@ -5943,7 +5942,7 @@
         _LIBCPP_INLINE_VISIBILITY
         vector<result_type> intervals() const {return __b_;}
         _LIBCPP_INLINE_VISIBILITY
-        vector<double> densities() const {return __densities_;}
+        vector<result_type> densities() const {return __densities_;}
 
         friend _LIBCPP_INLINE_VISIBILITY
             bool operator==(const param_type& __x, const param_type& __y)
@@ -6014,7 +6013,7 @@
     _LIBCPP_INLINE_VISIBILITY
     vector<result_type> intervals() const {return __p_.intervals();}
     _LIBCPP_INLINE_VISIBILITY
-    vector<double> densities() const {return __p_.densities();}
+    vector<result_type> densities() const {return __p_.densities();}
 
     _LIBCPP_INLINE_VISIBILITY
     param_type param() const {return __p_;}
@@ -6070,13 +6069,13 @@
 piecewise_constant_distribution<_RealType>::param_type::__init()
 {
     // __densities_ contains non-normalized areas
-    __area_type __total_area = _STD::accumulate(__densities_.begin(),
+    result_type __total_area = _STD::accumulate(__densities_.begin(),
                                                 __densities_.end(),
-                                                __area_type());
+                                                result_type());
     for (size_t __i = 0; __i < __densities_.size(); ++__i)
         __densities_[__i] /= __total_area;
     // __densities_ contains normalized areas
-    __areas_.assign(__densities_.size(), __area_type());
+    __areas_.assign(__densities_.size(), result_type());
     _STD::partial_sum(__densities_.begin(), __densities_.end() - 1,
                                                           __areas_.begin() + 1);
     // __areas_ contains partial sums of normalized areas: [0, __densities_ - 1]
@@ -6167,9 +6166,8 @@
     typedef uniform_real_distribution<result_type> _Gen;
     result_type __u = _Gen()(__g);
     ptrdiff_t __k = _STD::upper_bound(__p.__areas_.begin(), __p.__areas_.end(),
-                               static_cast<double>(__u)) - __p.__areas_.begin() - 1;
-    return static_cast<result_type>((__u - __p.__areas_[__k]) / __p.__densities_[__k]
-                                    + __p.__b_[__k]);
+                                      __u) - __p.__areas_.begin() - 1;
+    return (__u - __p.__areas_[__k]) / __p.__densities_[__k] + __p.__b_[__k];
 }
 
 template <class _CharT, class _Traits, class _RT>
@@ -6205,7 +6203,6 @@
     typedef piecewise_constant_distribution<_RT> _Eng;
     typedef typename _Eng::result_type result_type;
     typedef typename _Eng::param_type param_type;
-    typedef typename param_type::__area_type __area_type;
     __save_flags<_CharT, _Traits> _(__is);
     __is.flags(ios_base::dec | ios_base::skipws);
     size_t __n;
@@ -6214,11 +6211,11 @@
     for (size_t __i = 0; __i < __n; ++__i)
         __is >> __b[__i];
     __is >> __n;
-    vector<double> __densities(__n);
+    vector<result_type> __densities(__n);
     for (size_t __i = 0; __i < __n; ++__i)
         __is >> __densities[__i];
     __is >> __n;
-    vector<__area_type> __areas(__n);
+    vector<result_type> __areas(__n);
     for (size_t __i = 0; __i < __n; ++__i)
         __is >> __areas[__i];
     if (!__is.fail())
@@ -6241,10 +6238,9 @@
 
     class _LIBCPP_VISIBLE param_type
     {
-        typedef typename common_type<double, result_type>::type __area_type;
         vector<result_type> __b_;
-        vector<double> __densities_;
-        vector<__area_type> __areas_;
+        vector<result_type> __densities_;
+        vector<result_type> __areas_;
     public:
         typedef piecewise_linear_distribution distribution_type;
 
@@ -6262,7 +6258,7 @@
         _LIBCPP_INLINE_VISIBILITY
         vector<result_type> intervals() const {return __b_;}
         _LIBCPP_INLINE_VISIBILITY
-        vector<double> densities() const {return __densities_;}
+        vector<result_type> densities() const {return __densities_;}
 
         friend _LIBCPP_INLINE_VISIBILITY
             bool operator==(const param_type& __x, const param_type& __y)
@@ -6333,7 +6329,7 @@
     _LIBCPP_INLINE_VISIBILITY
     vector<result_type> intervals() const {return __p_.intervals();}
     _LIBCPP_INLINE_VISIBILITY
-    vector<double> densities() const {return __p_.densities();}
+    vector<result_type> densities() const {return __p_.densities();}
 
     _LIBCPP_INLINE_VISIBILITY
     param_type param() const {return __p_;}
@@ -6389,8 +6385,8 @@
 void
 piecewise_linear_distribution<_RealType>::param_type::__init()
 {
-    __areas_.assign(__densities_.size() - 1, __area_type());
-    __area_type _S = 0;
+    __areas_.assign(__densities_.size() - 1, result_type());
+    result_type _S = 0;
     for (size_t __i = 0; __i < __areas_.size(); ++__i)
     {
         __areas_[__i] = (__densities_[__i+1] + __densities_[__i]) *
@@ -6491,19 +6487,19 @@
     typedef uniform_real_distribution<result_type> _Gen;
     result_type __u = _Gen()(__g);
     ptrdiff_t __k = _STD::upper_bound(__p.__areas_.begin(), __p.__areas_.end(),
-                               static_cast<double>(__u)) - __p.__areas_.begin() - 1;
+                                      __u) - __p.__areas_.begin() - 1;
     __u -= __p.__areas_[__k];
-    const double __dk = __p.__densities_[__k];
-    const double __dk1 = __p.__densities_[__k+1];
-    const double __deltad = __dk1 - __dk;
+    const result_type __dk = __p.__densities_[__k];
+    const result_type __dk1 = __p.__densities_[__k+1];
+    const result_type __deltad = __dk1 - __dk;
     const result_type __bk = __p.__b_[__k];
     if (__deltad == 0)
-        return static_cast<result_type>(__u / __dk + __bk);
+        return __u / __dk + __bk;
     const result_type __bk1 = __p.__b_[__k+1];
     const result_type __deltab = __bk1 - __bk;
-    return static_cast<result_type>((__bk * __dk1 - __bk1 * __dk +
+    return (__bk * __dk1 - __bk1 * __dk +
         _STD::sqrt(__deltab * (__deltab * __dk * __dk + 2 * __deltad * __u))) /
-        __deltad);
+        __deltad;
 }
 
 template <class _CharT, class _Traits, class _RT>
@@ -6539,7 +6535,6 @@
     typedef piecewise_linear_distribution<_RT> _Eng;
     typedef typename _Eng::result_type result_type;
     typedef typename _Eng::param_type param_type;
-    typedef typename param_type::__area_type __area_type;
     __save_flags<_CharT, _Traits> _(__is);
     __is.flags(ios_base::dec | ios_base::skipws);
     size_t __n;
@@ -6548,11 +6543,11 @@
     for (size_t __i = 0; __i < __n; ++__i)
         __is >> __b[__i];
     __is >> __n;
-    vector<double> __densities(__n);
+    vector<result_type> __densities(__n);
     for (size_t __i = 0; __i < __n; ++__i)
         __is >> __densities[__i];
     __is >> __n;
-    vector<__area_type> __areas(__n);
+    vector<result_type> __areas(__n);
     for (size_t __i = 0; __i < __n; ++__i)
         __is >> __areas[__i];
     if (!__is.fail())
