Index: include/random
===================================================================
--- include/random	(revision 201171)
+++ include/random	(working copy)
@@ -3769,9 +3769,14 @@
 typename uniform_real_distribution<_RealType>::result_type
 uniform_real_distribution<_RealType>::operator()(_URNG& __g, const param_type& __p)
 {
-    return (__p.b() - __p.a())
-        * _VSTD::generate_canonical<_RealType, numeric_limits<_RealType>::digits>(__g)
-        + __p.a();
+    typename uniform_real_distribution<_RealType>::result_type __r;
+    do
+    {
+        __r = (__p.b() - __p.a())
+            * _VSTD::generate_canonical<_RealType, numeric_limits<_RealType>::digits>(__g)
+            + __p.a();
+    } while (__r >= __p.b());
+    return __r;
 }
 
 template <class _CharT, class _Traits, class _RT>
Index: test/numerics/rand/rand.dis/rand.dist.uni/rand.dist.uni.real/eval.pass.cpp
===================================================================
--- test/numerics/rand/rand.dis/rand.dist.uni/rand.dist.uni.real/eval.pass.cpp	(revision 201171)
+++ test/numerics/rand/rand.dis/rand.dist.uni/rand.dist.uni.real/eval.pass.cpp	(working copy)
@@ -469,4 +469,16 @@
         assert(std::abs(skew - x_skew) < 0.01);
         assert(std::abs((kurtosis - x_kurtosis) / x_kurtosis) < 0.01);
     }
+    {
+        typedef std::uniform_real_distribution<> D;
+        typedef std::default_random_engine G;
+        double range[] = {1.0, std::nextafter(1.0, 2.0)};
+        D d(range[0], range[1]);
+        G g;
+        for (int i=0; i<10; ++i)
+        {
+            double v = d(g);
+            assert(range[0] <= v && v < range[1]);
+        }
+    }
 }
