RandomNumberGenerator

protocol RandomNumberGenerator

A type that provides uniformly distributed random data.

Conforming Types SystemRandomNumberGenerator

When you call methods that use random data, such as creating new random values or shuffling a collection, you can pass a RandomNumberGenerator type to be used as the source for randomness. When you don't pass a generator, the default SystemRandomNumberGenerator type is used.

When providing new APIs that use randomness, provide a version that accepts a generator conforming to the RandomNumberGenerator protocol as well as a version that uses the default system generator. For example, this Weekday enumeration provides static methods that return a random day of the week:

enum Weekday: CaseIterable {
    case sunday, monday, tuesday, wednesday, thursday, friday, saturday

    static func random<G: RandomNumberGenerator>(using generator: inout G) -> Weekday {
        return Weekday.allCases.randomElement(using: &generator)!
    }

    static func random() -> Weekday {
        var g = SystemRandomNumberGenerator()
        return Weekday.random(using: &g)
    }
}

Conforming to the RandomNumberGenerator Protocol

A custom RandomNumberGenerator type can have different characteristics than the default SystemRandomNumberGenerator type. For example, a seedable generator can be used to generate a repeatable sequence of random values for testing purposes.

To make a custom type conform to the RandomNumberGenerator protocol, implement the required next() method. Each call to next() must produce a uniform and independent random value.

Types that conform to RandomNumberGenerator should specifically document the thread safety and quality of the generator.

Instance Methods

func next() -> UInt64 Required

Returns a value from a uniform, independent distribution of binary data.

Use this method when you need random binary data to generate another value. If you need an integer value within a specific range, use the static random(in:using:) method on that integer type instead of this method.

Declaration

mutating func next() -> UInt64