<html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; line-break: after-white-space;" class=""><br class=""><div><br class=""><blockquote type="cite" class=""><div class="">On 28. Nov 2017, at 00:20, Martin Waitz via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org" class="">swift-evolution@swift.org</a>&gt; wrote:</div><br class="Apple-interchange-newline"><div class=""><div class="">Hello,<br class=""><br class=""><blockquote type="cite" class="">Maybe we call the default RNG instance `random`, and then give the `random(in:)` methods another name, like `choose(in:)`?<br class=""><br class=""><span class="Apple-tab-span" style="white-space:pre">        </span>let diceRoll = random.choose(in: 1...6)<br class=""><span class="Apple-tab-span" style="white-space:pre">        </span>let card = random.choose(in: deck)<br class=""><span class="Apple-tab-span" style="white-space:pre">        </span>let isHeads = random.choose(in: [true, false])<br class=""><span class="Apple-tab-span" style="white-space:pre">        </span>let probability = random.choose(in: 0.0...1.0)<br class=""><span class="Apple-tab-span" style="white-space:pre">        </span><br class=""><span class="Apple-tab-span" style="white-space:pre">        </span>let diceRoll = rng.choose(in: 1...6)<br class=""><span class="Apple-tab-span" style="white-space:pre">        </span>let card = rng.choose(in: deck)<br class=""><span class="Apple-tab-span" style="white-space:pre">        </span>let isHeads = rng.choose(in: [true, false])<br class=""><span class="Apple-tab-span" style="white-space:pre">        </span>let probability = rng.choose(in: 0.0...1.0)<br class=""></blockquote><br class="">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.<br class="">Modeling that as methods of the RNG seems to be much more natural.<br class=""><br class="">-- <br class="">Martin<br class="">_______________________________________________<br class="">swift-evolution mailing list<br class=""><a href="mailto:swift-evolution@swift.org" class="">swift-evolution@swift.org</a><br class="">https://lists.swift.org/mailman/listinfo/swift-evolution<br class=""></div></div></blockquote></div><br class=""><div class="">+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.</div><div class=""><br class=""></div><div class="">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:</div><div class=""><br class=""></div><blockquote style="margin: 0 0 0 40px; border: none; padding: 0px;" class=""><div class=""><font face="Courier" class="">protocol RandomNumberGenerator {</font></div><div class=""><font face="Courier" class="">&nbsp; &nbsp; func random&lt;C&gt;(from: C) -&gt; C.Element? where C: Collection</font></div><div class=""><font face="Courier" class="">}</font></div><div class=""><font face="Courier" class=""><br class=""></font></div><div class=""><font face="Courier" class="">// I don’t know; there is probably a real compsci/maths/stats name for this. See&nbsp;‘enum' discussion.</font></div><div class=""><br class=""></div><div class=""><font face="Courier" class="">protocol ClosedValueSet {</font></div><div class=""><font face="Courier" class="">&nbsp; &nbsp; static var allValues: AnyCollection&lt;Self&gt; { get }&nbsp;</font></div><div class=""><font face="Courier" class="">}</font></div><div class=""><font face="Courier" class=""><br class=""></font></div><div class=""><font face="Courier" class="">extension RandomNumberGenerator {</font></div><div class=""><font face="Courier" class="">&nbsp; &nbsp; func random&lt;T&gt;() -&gt; T? where T: ClosedValueSet {</font></div><div class=""><font face="Courier" class="">&nbsp; &nbsp; &nbsp; &nbsp; return random(from: T.allValues)</font></div><div class=""><font face="Courier" class="">&nbsp; &nbsp; }</font></div><div class=""><font face="Courier" class="">}</font></div><div class=""><font face="Courier" class=""><br class=""></font></div><div class=""><font face="Courier" class="">extension Int: ClosedValueSet {</font></div><div class=""><font face="Courier" class="">&nbsp; &nbsp; static var allValues: AnyCollection&lt;Int&gt; { return AnyCollection(Int.min..&lt;Int.max) }</font></div><div class=""><font face="Courier" class="">}</font></div><div class=""><font face="Courier" class=""><br class=""></font></div><div class=""><div class=""><font face="Courier" class="">extension Bool: ClosedValueSet {</font></div></div><div class=""><div class=""><font face="Courier" class="">&nbsp; &nbsp; static var allValues: AnyCollection&lt;Bool&gt; { return AnyCollection([true, false]) }</font></div></div><div class=""><div class=""><font face="Courier" class="">}</font></div></div><div class=""><font face="Courier" class=""><br class=""></font></div><div class=""><font face="Courier" class="">// …etc</font></div></blockquote><div class=""><br class=""></div><div class="">- Karl</div></body></html>