function randomVonMisesFisher(n, kappa) {
const m = n - 1,
h = Math.hypot(2 * kappa, m),
b = m / (h + 2 * kappa),
a = (2 * kappa + h + m) / 4,
d = m * (1 - Math.log(m)),
sb = symmetricBeta(m / 2),
Z = d3.randomNormal();
return function() {
do {
var y = sb(),
denom = 1 - (1 - b) * y,
t = 2 * a * b / denom;
} while (m * Math.log(t) - t + d < Math.log(Math.random()));
do {
var vec = d3.range(m).map(Z),
ssq = vec.reduce((a, c) => a + c * c, 0);
} while (ssq === 0);
var w = (1 - (1 + b) * y) / denom,
mult = Math.sqrt((1 - w * w) / ssq);
vec = vec.map(x => x * mult);
vec.push(w);
return vec;
}
}