From 9c412ba436e3fab73cafa3f1a4c770cc18bdd146 Mon Sep 17 00:00:00 2001 From: Ilya Gorbunov Date: Mon, 27 Aug 2018 03:40:31 +0300 Subject: [PATCH] Fix incorrect range transform in nextUInt/nextULong with range parameter #KT-25570 --- libraries/stdlib/src/kotlin/random/Random.kt | 4 ++-- libraries/stdlib/test/random/RandomTest.kt | 2 ++ 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/libraries/stdlib/src/kotlin/random/Random.kt b/libraries/stdlib/src/kotlin/random/Random.kt index 4788b5625db..2ae986f5f1f 100644 --- a/libraries/stdlib/src/kotlin/random/Random.kt +++ b/libraries/stdlib/src/kotlin/random/Random.kt @@ -374,7 +374,7 @@ public fun Random.nextUInt(origin: UInt, bound: UInt): UInt { public fun Random.nextUInt(range: UIntRange): UInt = when { range.isEmpty() -> throw IllegalArgumentException("Cannot get random in empty range: $range") range.last < UInt.MAX_VALUE -> nextUInt(range.first, range.last + 1u) - range.first > UInt.MIN_VALUE -> nextUInt(range.first, range.last + 1u) + range.first > UInt.MIN_VALUE -> nextUInt(range.first - 1u, range.last) + 1u else -> nextUInt() } @@ -430,7 +430,7 @@ public fun Random.nextULong(origin: ULong, bound: ULong): ULong { public fun Random.nextULong(range: ULongRange): ULong = when { range.isEmpty() -> throw IllegalArgumentException("Cannot get random in empty range: $range") range.last < ULong.MAX_VALUE -> nextULong(range.first, range.last + 1u) - range.first > ULong.MIN_VALUE -> nextULong(range.first, range.last + 1u) + range.first > ULong.MIN_VALUE -> nextULong(range.first - 1u, range.last) + 1u else -> nextULong() } diff --git a/libraries/stdlib/test/random/RandomTest.kt b/libraries/stdlib/test/random/RandomTest.kt index a4af0b4ea78..41d98e3e7e9 100644 --- a/libraries/stdlib/test/random/RandomTest.kt +++ b/libraries/stdlib/test/random/RandomTest.kt @@ -180,6 +180,7 @@ abstract class RandomSmokeTest { (1u..5u), (0u..31u), (0u..UInt.MAX_VALUE - 1u), + (1u..UInt.MAX_VALUE), (0u..UInt.MAX_VALUE) )) { repeat(1000) { @@ -338,6 +339,7 @@ abstract class RandomSmokeTest { (1uL..5uL), (0uL..31uL), (0uL..(ULong.MAX_VALUE - 1uL)), + (1uL..ULong.MAX_VALUE), (0uL..ULong.MAX_VALUE) )) { repeat(1000) {