Interesting challenge. Is the following algorithm conceptually correct to achieve the desired goal (obviously quite slow):
func random(from: Double, to: Double, step: Int = 1) -> Double {
print("step #\(step), choose random from: \(from) to: \(to), delta: \(to - from)")
if from == to { return from }
let middle = (from + to)/2
return if Bool.random() {
random(from: from, to: middle, step: step + 1)
} else {
random(from: middle, to: to, step: step + 1)
}
}
let result = random(from: 0, to: 1)
print("result: \(result)")
Example output:
step #1, choose random from: 0.0 to: 1.0, delta: 1.0
step #2, choose random from: 0.5 to: 1.0, delta: 0.5
step #3, choose random from: 0.75 to: 1.0, delta: 0.25
step #4, choose random from: 0.75 to: 0.875, delta: 0.125
step #5, choose random from: 0.75 to: 0.8125, delta: 0.0625
step #6, choose random from: 0.78125 to: 0.8125, delta: 0.03125
step #7, choose random from: 0.78125 to: 0.796875, delta: 0.015625
step #8, choose random from: 0.7890625 to: 0.796875, delta: 0.0078125
step #9, choose random from: 0.7890625 to: 0.79296875, delta: 0.00390625
step #10, choose random from: 0.791015625 to: 0.79296875, delta: 0.001953125
step #11, choose random from: 0.7919921875 to: 0.79296875, delta: 0.0009765625
step #12, choose random from: 0.79248046875 to: 0.79296875, delta: 0.00048828125
step #13, choose random from: 0.79248046875 to: 0.792724609375, delta: 0.000244140625
step #14, choose random from: 0.7926025390625 to: 0.792724609375, delta: 0.0001220703125
step #15, choose random from: 0.7926025390625 to: 0.79266357421875, delta: 6.103515625e-05
step #16, choose random from: 0.792633056640625 to: 0.79266357421875, delta: 3.0517578125e-05
step #17, choose random from: 0.792633056640625 to: 0.7926483154296875, delta: 1.52587890625e-05
step #18, choose random from: 0.7926406860351562 to: 0.7926483154296875, delta: 7.62939453125e-06
step #19, choose random from: 0.7926445007324219 to: 0.7926483154296875, delta: 3.814697265625e-06
step #20, choose random from: 0.7926464080810547 to: 0.7926483154296875, delta: 1.9073486328125e-06
step #21, choose random from: 0.7926473617553711 to: 0.7926483154296875, delta: 9.5367431640625e-07
step #22, choose random from: 0.7926473617553711 to: 0.7926478385925293, delta: 4.76837158203125e-07
step #23, choose random from: 0.7926476001739502 to: 0.7926478385925293, delta: 2.384185791015625e-07
step #24, choose random from: 0.7926477193832397 to: 0.7926478385925293, delta: 1.1920928955078125e-07
step #25, choose random from: 0.7926477789878845 to: 0.7926478385925293, delta: 5.960464477539063e-08
step #26, choose random from: 0.7926477789878845 to: 0.7926478087902069, delta: 2.9802322387695312e-08
step #27, choose random from: 0.7926477789878845 to: 0.7926477938890457, delta: 1.4901161193847656e-08
step #28, choose random from: 0.7926477864384651 to: 0.7926477938890457, delta: 7.450580596923828e-09
step #29, choose random from: 0.7926477901637554 to: 0.7926477938890457, delta: 3.725290298461914e-09
step #30, choose random from: 0.7926477920264006 to: 0.7926477938890457, delta: 1.862645149230957e-09
step #31, choose random from: 0.7926477929577231 to: 0.7926477938890457, delta: 9.313225746154785e-10
step #32, choose random from: 0.7926477929577231 to: 0.7926477934233844, delta: 4.656612873077393e-10
step #33, choose random from: 0.7926477931905538 to: 0.7926477934233844, delta: 2.3283064365386963e-10
step #34, choose random from: 0.7926477933069691 to: 0.7926477934233844, delta: 1.1641532182693481e-10
step #35, choose random from: 0.7926477933651768 to: 0.7926477934233844, delta: 5.820766091346741e-11
step #36, choose random from: 0.7926477933651768 to: 0.7926477933942806, delta: 2.9103830456733704e-11
step #37, choose random from: 0.7926477933797287 to: 0.7926477933942806, delta: 1.4551915228366852e-11
step #38, choose random from: 0.7926477933797287 to: 0.7926477933870046, delta: 7.275957614183426e-12
step #39, choose random from: 0.7926477933797287 to: 0.7926477933833667, delta: 3.637978807091713e-12
step #40, choose random from: 0.7926477933815477 to: 0.7926477933833667, delta: 1.8189894035458565e-12
step #41, choose random from: 0.7926477933824572 to: 0.7926477933833667, delta: 9.094947017729282e-13
step #42, choose random from: 0.7926477933824572 to: 0.7926477933829119, delta: 4.547473508864641e-13
step #43, choose random from: 0.7926477933824572 to: 0.7926477933826845, delta: 2.2737367544323206e-13
step #44, choose random from: 0.7926477933825709 to: 0.7926477933826845, delta: 1.1368683772161603e-13
step #45, choose random from: 0.7926477933825709 to: 0.7926477933826277, delta: 5.684341886080802e-14
step #46, choose random from: 0.7926477933825709 to: 0.7926477933825993, delta: 2.842170943040401e-14
step #47, choose random from: 0.7926477933825709 to: 0.7926477933825851, delta: 1.4210854715202004e-14
step #48, choose random from: 0.7926477933825709 to: 0.792647793382578, delta: 7.105427357601002e-15
step #49, choose random from: 0.7926477933825709 to: 0.7926477933825744, delta: 3.552713678800501e-15
step #50, choose random from: 0.7926477933825726 to: 0.7926477933825744, delta: 1.7763568394002505e-15
step #51, choose random from: 0.7926477933825726 to: 0.7926477933825735, delta: 8.881784197001252e-16
step #52, choose random from: 0.7926477933825731 to: 0.7926477933825735, delta: 4.440892098500626e-16
step #53, choose random from: 0.7926477933825731 to: 0.7926477933825733, delta: 2.220446049250313e-16
step #54, choose random from: 0.7926477933825732 to: 0.7926477933825733, delta: 1.1102230246251565e-16
step #55, choose random from: 0.7926477933825733 to: 0.7926477933825733, delta: 0.0
result: 0.7926477933825733