private static void InitLookup ()
{
double l = 5;
double r = 10;
double scale = 50;
double sum = 0;
while (r - l > 0.0000001) {
sum = 0;
scale = (l + r) * 0.5;
for (var i = 0; i < tableSize; ++i) {
sum += NormalCurve (16.0 * ((double)i - tableSize / 2) / tableSize, scale);
if (sum > 1000000) {
break;
}
}
if (sum > tableSize) {
r = scale;
} else if (sum < tableSize) {
l = scale;
} else {
break;
}
}
lookup = new int[tableSize];
sum = 0;
int roundedSum = 0, lastRoundedSum;
for (var i = 0; i < tableSize; ++i) {
sum += NormalCurve (16.0 * ((double)i - tableSize / 2) / tableSize, scale);
lastRoundedSum = roundedSum;
roundedSum = (int)sum;
for (var j = lastRoundedSum; j < roundedSum; ++j) {
lookup[j] = (i - tableSize / 2) * 65536 / tableSize;
}
}
}
#endregion