使用arc4random_uniform返回整个和非整个双精度数

时间:2016-04-09 19:59:08

标签: swift arc4random

使用Swift,我试图弄清楚如何使用arc4random_uniform返回一个像37.7这样的数字。我必须遵循的指导是我必须在一个函数中执行它,随机双精度必须在0到300之间。我已经能够构建一个函数,该函数在范围之间随机返回双精度但无法找到任何会引导我输出随机非整数

//function to randomly generate a double number like 105.3
func makeRandDbl() -> Double {
    let randGenerator: Double = Double(arc4random_uniform(301))
    print(randGenerator)

return randGenerator
}

makeRandDb()

3 个答案:

答案 0 :(得分:2)

要生成0.0到300.0范围内的Double(小数点后面有一位数字):

Double(arc4random_uniform(3001))/10.0

您可以将此扩展到更多小数位。小数点后两位(0.00到300.00):

Double(arc4random_uniform(30001))/100.0

小数点后三位(0.000到300.000):

Double(arc4random_uniform(300001))/1000.0

这具有能够实际生成整个值的优点。在第一种情况下,10%的数字将是完整的。在第二种情况下,1%的数字将是完整的。第三,0.1%的数字将是完整的。

答案 1 :(得分:2)

这是你的功能,我相信:

extension Double {

/// Generates a random `Double` within `0.0...1.0`
public static func random() -> Double {
    return random(0.0...1.0)
}

/// Generates a random `Double` inside of the closed interval.
public static func random(interval: ClosedInterval<Double>) -> Double {
    return interval.start + (interval.end - interval.start) * (Double(arc4random()) / Double(UInt32.max))
}

}

用法示例:

Double.random(0...300)

它来自RandomKit库 - 它看起来非常适用于各种用途。

答案 2 :(得分:1)

一种方法是将arc4random_uniform的结果转换为double,将结果除以UInt32.max,然后将结果乘以300.

let rand = 300 * Double(arc4random_uniform(UInt32.max)) / Double(UInt32.max)

这将产生0到300之间的值,包括0和300。您将获得的可能值的数量为UInt32.max