[swift-evolution] [Proposal] Random Unification
Jonathan Hull
jhull at gbis.com
Thu Nov 30 18:15:52 CST 2017
> On Nov 30, 2017, at 3:46 PM, Martin Waitz <tali at admingilde.org> wrote:
>
> Hello Jonathan,
>
>> For collections, I think we should call returning a random element -randomElement, and choosing a random element without replacement -popRandomElement
>
> I disagree because I don’t think that the random data is a property of the collection.
> The collection is not the subject which has random elements, it’s more the object which is used when drawing an element.
The collection is a subject which has elements, and we are asking for one of them at random.
>> var list = [1,2,3,4]
>> let a:Int? = list.randomElement //List is still [1,2,3,4] and ‘a’ contains one of the elements
>
> Instead I would prefer to have something like:
>
> let a = random.draw(from: list)
But now the RNG has to understand the concept of collections. I would argue it is much cleaner to write an extension on Collection.
func randomElement(using source: RandomSource = .default) -> Element? {
guard !isEmpty else {return nil}
let idx = Int.random(in: 0…(count - 1), using: source)
return self[idx]
}
>
>> let b:Int? = list.popRandomElement //Now list contains all the elements except the one in ‚b’
>
> we already have remove(at:), this can be used trivially:
>
> let b = list.remove(at: random.draw(from: list.indices))
>
> a little bit more verbose, but easily understandable.
> It uses well known building blocks and does not increase the API surface of collections.
True. But you could make the same argument for popLast().
I think both are common enough use-cases that they warrant the convenience method. If not though, I can just add it myself for my own code.
Thanks,
Jon
More information about the swift-evolution
mailing list