///|
pub fn Tensor::randn(
ctx : AutogradContext,
shape : Array[Int],
rng : @random.Rand,
) -> Tensor {
let n = shape_size(shape)
let data = Array::make(n, 0.0)
let mut i = 0
while i < n {
let u1 = rng.double().max(1.0e-12)
let u2 = rng.double()
let r = (-2.0 * @math.ln(u1)).sqrt()
let theta = 2.0 * @math.PI * u2
data[i] = r * @math.cos(theta)
if i + 1 < n {
data[i + 1] = r * @math.sin(theta)
}
i += 2
}
Tensor::parameter(ctx, data, shape)
}