> On Jan 9, 2018, at 3:12 AM, Jonathan Hull via swift-evolution 
> <swift-evolution@swift.org> wrote:
> 
> Some thoughts:
> 
> - How do I randomly select an enum?

Well… combine this with SE-0194 and you have all the basics you need: the set 
of all enum values in a collection, and a way to pick a random element from a 
collection...

> 
> - I like that RandomNumberGenerator doesn’t have an associated type. I agree 
> that we should just spit out UInt64s for simplicity.
> 
> - I don’t like how it is so closely tied with Range.  I realize that both Int 
> and Float work with Ranges, but other random types do not (e.g. CGVectors).  
> You are special casing FixedWidthInteger and BinaryFloatingPoint, which are 
> very important… but we lose the ability to deal with other randomly generated 
> types.
> 
> - Following on the previous point, I don’t like that the code for dealing 
> with Integers/Floats is in Range.  It feels like things aren’t properly 
> encapsulated. 
> 
> - Why bother supporting non-closed Ranges at all?  If you only allow closed 
> ranges, then you can’t end up with an empty range. The only difference in 
> behavior I can think of is on floating point, but I can’t think of a use-case 
> where excluding the supremum is actually useful in any real world way.
> 
> - This may sound strange, but I would really like to see Bool handled as a 
> default implementation on the generator protocol itself.  On my own version 
> of this I have both the ‘coinFlip()’ and ‘oneIn(_ num:Int)’ methods which I 
> find extremely useful.  CoinFlip just gives you a random bool, whereas you 
> can say things like oneIn(100) to get ‘true’ roughly 1 out of every 100 times 
> you call it.  These are useful for branching randomly.  They are most useful 
> on the source/generator itself because it is ergonomic when you need to 
> rewind the source.
> 
> - IMO distributions should be sources/generators themselves which just wrap 
> another source.  We could have a subprotocol of RandomNumberGenerator which 
> just semantically guarantees uniform distribution, and then distributions 
> that need it could be sure of the input distribution.  Notice this doesn’t 
> limit the distribution to only be used for Integers as they are in the demo. 
> They can be used anywhere a source can be used.
> 
> - Having a subprotocol for generators which can be rewound is extremely 
> important for entire classes of real-world problems.  I have spent a lot of 
> time using this and it solves a LOT of problems. For example, I have a Lorem 
> Ipsum Generator which takes Attributes and a CGSize to fill.  It works by 
> branching (using the Bool methods above) and then rewinding bits which don’t 
> fit (If you just futz with the last part instead of generating appropriate 
> clauses, it won’t look right).  I also have a bunch of backtracking 
> algorithms which rely on this rewind ability.  Plus numerous visual effects 
> which rely on a repeatable rewindable source.
>       - Tl;dr: It isn’t enough to just have a seed, you need to be able to 
> mark a state of a generator and return to that state later.
> 
>       My RepeatableRandomSource Protocol has 3 extra methods:
>       - It takes a seed
>       - It has a mark() method which returns a token
>       - It has a returnToMark(_ mark:Mark) method which takes a token and 
> restores the appropriate state 
> 
> - I really appreciate that you made a playground :-)
> 
> Thanks,
> Jon
> 
> 
>> On Jan 8, 2018, at 11:02 AM, Nate Cook via swift-evolution 
>> <swift-evolution@swift.org <mailto:swift-evolution@swift.org>> wrote:
>> 
>> I created a playground to explore this question, starting with a minimal 
>> subset of the proposal’s additions and building from there. The attached 
>> playground demonstrates what’s possible with this subset on the first page, 
>> then uses subsequent pages to explore how the main random facilities of the 
>> C++ STL work under this model. (In my opinion, they work pretty well!)
>> 
>> The subset in the playground has three main differences from the proposal:
>>  - It doesn't include a Randomizable protocol or a random property on 
>> numeric types.
>>  - It doesn't include the static random(in:) methods on numeric types, 
>> either.
>>  - The RandomNumberGenerator protocol doesn't have an associated type. 
>> Instead, it requires all conforming types to produce UInt64 values.
>> 
>> I’ve tried to include a bit of real-world usage in the playground to 
>> demonstrate what writing code would look like with these additions. Please 
>> take a look!
>> 
>> Nate
>> 
>> <Random.playground.zip>
>> 
>>> On Dec 2, 2017, at 9:50 PM, Dave Abrahams via swift-evolution 
>>> <swift-evolution@swift.org <mailto:swift-evolution@swift.org>> wrote:
>>> 
>>> I don’t have much to say about this other than that I think the discussion 
>>> seems way too narrow, focusing on spelling rather than on functionality and 
>>> composability.  I consider the “generic random number library” design to be 
>>> a mostly-solved problem, in the C++ standard library 
>>> (http://en.cppreference.com/w/cpp/numeric/random 
>>> <http://en.cppreference.com/w/cpp/numeric/random>).  Whatever goes into the 
>>> Swift standard library does not need to have all those features right away, 
>>> but should support being extended into something having the same general 
>>> shape. IMO the right design strategy is to implement and use a Swift 
>>> version of C++’s facilities and only then consider proposing [perhaps a 
>>> subset of] that design for standardization in Swift.
>>> 
>>> Sent from my iPad
>>> 
>>> On Dec 2, 2017, at 5:12 PM, Kyle Murray via swift-evolution 
>>> <swift-evolution@swift.org <mailto:swift-evolution@swift.org>> wrote:
>>> 
>>>> 
>>>>> On Dec 2, 2017, at 6:02 PM, Xiaodi Wu via swift-evolution 
>>>>> <swift-evolution@swift.org <mailto:swift-evolution@swift.org>> wrote:
>>>>> 
>>>>> Instead, we ought to make clear to users both the features and the 
>>>>> limitations of this API, to encourage use where suitable and to 
>>>>> discourage use where unsuitable.
>>>> 
>>>> I like that you're considering the balance here. I've been lightly 
>>>> following this thread and want to add my thoughts on keeping crypto and 
>>>> pseudorandomness out of the name of at least one random API intended for 
>>>> general use.
>>>> 
>>>> For someone who doesn't know or care about the subtleties of insecure or 
>>>> pseudorandom numbers, I'm not sure that the name insecureRandom is 
>>>> effectively much different than badRandom, at least in terms of the 
>>>> information it conveys to non-experts. To Greg's point, that's the 
>>>> opposite of the signal that the API name should suggest because it's what 
>>>> most people should use most of the time. As you say, this API is being 
>>>> designed for general use.
>>>> 
>>>> There's a cost to adding extra complexity to names, too. I don't think 
>>>> it's far-fetched to suspect that people who find insecureRandom in an 
>>>> autocomplete listing or search will think "Where's the plain random 
>>>> function?"... and then go looking for a community extension that will 
>>>> inevitably provide a trivial alias: func random() { return 
>>>> insecureRandom() }. That's the sort of adoption I'd expect from something 
>>>> for new programmers, like Swift Playgrounds. Someone's introduction to 
>>>> randomness in programming should probably involve no more than a 
>>>> straightforward mapping from the elementary definition, rather than 
>>>> forcing a teaching moment from more advanced math.
>>>> 
>>>> I think there are better places for caveat information than in the API 
>>>> names themselves; documentation being one clear destination. This is in 
>>>> contrast with Unsafe*Pointer, where the safety element is critical enough 
>>>> to be elevated to be more than caveat-level information. You can go really 
>>>> far and create really cool things before these caveats start to apply. 
>>>> Using randomness as a black box in an intro programming environment seems 
>>>> like a much more common scenario than someone attempting to roll their 
>>>> first crypto by only reading API names and hoping for the best.
>>>> 
>>>> -Kyle
>>>> _______________________________________________
>>>> swift-evolution mailing list
>>>> swift-evolution@swift.org <mailto:swift-evolution@swift.org>
>>>> https://lists.swift.org/mailman/listinfo/swift-evolution 
>>>> <https://lists.swift.org/mailman/listinfo/swift-evolution>
>>> _______________________________________________
>>> swift-evolution mailing list
>>> swift-evolution@swift.org <mailto:swift-evolution@swift.org>
>>> https://lists.swift.org/mailman/listinfo/swift-evolution 
>>> <https://lists.swift.org/mailman/listinfo/swift-evolution>
>> 
>> _______________________________________________
>> swift-evolution mailing list
>> swift-evolution@swift.org <mailto:swift-evolution@swift.org>
>> https://lists.swift.org/mailman/listinfo/swift-evolution
> 
> _______________________________________________
> swift-evolution mailing list
> swift-evolution@swift.org
> https://lists.swift.org/mailman/listinfo/swift-evolution

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

Reply via email to