I agree. If there should be an API to produce a random Double without parameters then IMHO it should simply be a uniformly distributed Double in the unit range [0, 1). Very useful as a basic building block and can be constructed very fast from a random bitpattern like eg: extension Double { init(unitRange v: UInt64) { self = Double(v >> Double.exponentBitCount) * (.ulpOfOne/2.0) } }
On Wed, Jan 10, 2018 at 11:48 PM, Saagar Jha <saa...@saagarjha.com> wrote: > Which begs the question: why would you want to do something like this? > Creating a “random” Double from its full range of values is an odd thing to > do, and the fact that it is non-uniform and has irregularities like > infinity and signed zeros makes it likely that any such usage is probably > done in error (the one reason I can think of is if you’re trying to test > your code with random Doubles, but I’d argue for keeping NaN in that case). > Generally users are looking for uniform distributions or ones that follow > some set pattern (e.g. normal, Bernoulli), so this doesn’t seem useful at > all. > > Saagar Jha > > On Jan 10, 2018, at 14:39, Jens Persson <j...@bitcycle.com> wrote: > > On Wed, Jan 10, 2018 at 11:27 PM, Saagar Jha <saa...@saagarjha.com> wrote: > >> Not a floating point expert, but are you sure this works? I have a >> feeling this would lead to a distribution that’s not uniform. >> >> > Yes, it would not be uniform, which is exactly what I meant by the last > part of: "Assuming you are ok with signed zero and infinities and > "strange" bias as result of IEEE 754" > > Also, I think it's impossible to get a uniform distribution of all non-Nan > Double values (since they include +- infinity). > > /Jens > > > >> Saagar Jha >> >> On Jan 10, 2018, at 14:07, Jens Persson via swift-evolution < >> swift-evolution@swift.org> wrote: >> >> On Tue, Jan 9, 2018 at 10:07 PM, Jonathan Hull via swift-evolution < >> swift-evolution@swift.org> wrote: >> >>> >>> One additional question. How do you ergonomically get a Double which >>> doesn’t have a range, but also isn’t NaN? >>> >>> >> Assuming you are ok with signed zero and infinities and "strange" bias as >> result of IEEE 754: >> >> func randomNonNanDouble<R: RandomNumberGenerator>(using generator: R) -> >> Double { >> while true { >> let rndUInt64 = generator.next() >> let rndDouble = Double(bitPattern: rndUInt64) >> if rndDouble != Double.nan { return rndDouble } >> } >> } >> >> /Jens >> >> _______________________________________________ >> 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