> On 28. Nov 2017, at 00:20, Martin Waitz via swift-evolution 
> <swift-evolution@swift.org> wrote:
> 
> Hello,
> 
>> Maybe we call the default RNG instance `random`, and then give the 
>> `random(in:)` methods another name, like `choose(in:)`?
>> 
>>      let diceRoll = random.choose(in: 1...6)
>>      let card = random.choose(in: deck)
>>      let isHeads = random.choose(in: [true, false])
>>      let probability = random.choose(in: 0.0...1.0)
>>      
>>      let diceRoll = rng.choose(in: 1...6)
>>      let card = rng.choose(in: deck)
>>      let isHeads = rng.choose(in: [true, false])
>>      let probability = rng.choose(in: 0.0...1.0)
> 
> I like this design a lot. After all, `random` is not a property of some type 
> or instance, but we want to generate a new random element within some 
> range/based on some given set.
> Modeling that as methods of the RNG seems to be much more natural.
> 
> -- 
> Martin
> _______________________________________________
> swift-evolution mailing list
> swift-evolution@swift.org
> https://lists.swift.org/mailman/listinfo/swift-evolution

+1. This discussion seems to have been going on for a long time and I haven’t 
kept up with all of the arguments, but to me, “random” only makes sense when 
you’re talking about selecting something from a group.

Some data types, like Int and Bool, have a natural set of all discrete, allowed 
values, so there is some natural group to talk about which can serve as a 
reasonable default. Basically, they are similar to enums (remember the 
discussions we’ve been having about an “allCases” collection for enums? Is 
there possibly some unifying abstraction between these and types such as Int or 
Bool?). So I can only really see it looking more or less like this:

protocol RandomNumberGenerator {
    func random<C>(from: C) -> C.Element? where C: Collection
}

// I don’t know; there is probably a real compsci/maths/stats name for this. 
See ‘enum' discussion.

protocol ClosedValueSet {
    static var allValues: AnyCollection<Self> { get } 
}

extension RandomNumberGenerator {
    func random<T>() -> T? where T: ClosedValueSet {
        return random(from: T.allValues)
    }
}

extension Int: ClosedValueSet {
    static var allValues: AnyCollection<Int> { return 
AnyCollection(Int.min..<Int.max) }
}

extension Bool: ClosedValueSet {
    static var allValues: AnyCollection<Bool> { return AnyCollection([true, 
false]) }
}

// …etc

- Karl
_______________________________________________
swift-evolution mailing list
swift-evolution@swift.org
https://lists.swift.org/mailman/listinfo/swift-evolution

Reply via email to