var s : Double = 0.0
var v2 : Double = 0.0
var cachedNumberExists = false
// (read-only) computed properties
var gaussRand : Double {
var u1, u2, v1, x : Double
if !cachedNumberExists {
repeat {
u1 = Double(arc4random()) / Double(UINT32_MAX)
u2 = Double(arc4random()) / Double(UINT32_MAX)
v1 = 2 * u1 - 1;
v2 = 2 * u2 - 1;
s = v1 * v1 + v2 * v2;
} while (s >= 1 || s == 0)
x = v1 * sqrt(-2 * log(s) / s);
}
else {
x = v2 * sqrt(-2 * log(s) / s);
}
cachedNumberExists = !cachedNumberExists
return x
}
}
var myRandomGenerator = MyRandomGenerator()
let numGaussNumbers = 1000
var myGaussArr = [Double](repeating: 0.0, count: numGaussNumbers)
for (i,_) in myGaussArr.enumerated() { myGaussArr[i] = myRandomGenerator.gaussRand }
let myMean = myGaussArr.reduce(0.0, +)/Double(numGaussNumbers) // 0.0.. OK
let myVar = myGaussArr.map { pow(($0 - myMean), 2) }.reduce(0.0, +)/Double(numGaussNumbers) // ~1, O
print("(\(myMean),\(myVar))") // ~(0,1), OK
https://www.dropbox.com/s/x6oxhg62fa14exl/Screenshot%202017-02-17%2015.45.29.png?dl=0
чувак, зачем ты кидаешь тонну нечитаемого кода в чат
Обсуждают сегодня