Skip to content

Commit 7a302e8

Browse files
committed
Fix RandomSample crash when 0 was out from random.
1 parent d872b64 commit 7a302e8

File tree

2 files changed

+7
-2
lines changed

2 files changed

+7
-2
lines changed

Sources/Algorithms/RandomSample.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -87,14 +87,14 @@ extension Collection {
8787
internal func nextW<G: RandomNumberGenerator>(
8888
k: Int, using rng: inout G
8989
) -> Double {
90-
Double.root(.random(in: 0..<1, using: &rng), k)
90+
Double.root(1 - .random(in: 0..<1, using: &rng), k)
9191
}
9292

9393
@usableFromInline
9494
internal func nextOffset<G: RandomNumberGenerator>(
9595
w: Double, using rng: inout G
9696
) -> Int {
97-
Int(Double.log(.random(in: 0..<1, using: &rng)) / .log(1 - w))
97+
Int(Double.log(1 - .random(in: 0..<1, using: &rng)) / .log(1 - w))
9898
}
9999

100100
extension Collection {

Tests/SwiftAlgorithmsTests/RandomSampleTests.swift

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,4 +95,9 @@ final class RandomSampleTests: XCTestCase {
9595
let sample2c = c.randomStableSample(count: k, using: &generator)
9696
XCTAssertEqual(sample1c, sample2c)
9797
}
98+
99+
func testRandomSampleZeroRandom() {
100+
var generator = SplitMix64(seed: 0x61c8864680b583eb) // this seed starts with 0
101+
_ = c.randomSample(count: k, using: &generator) // must not crash
102+
}
98103
}

0 commit comments

Comments
 (0)