#include <iostream>
#include <iomanip>
#include <string>
#include <map>
#include <random>
#include <cmath>
std::random_device rd;
std::mt19937 gen(rd());
std::normal_distribution<> d(0,1);
double invErr;
double f(float skew){
float x = d(gen);
while (x < -1 || x > 1)
x = d(gen);
double c = invErr;
if (x < c)
return (x + 1) * (skew) / (c - (-1));
else
return (x - c) * (1-skew) / (1 - c) + skew;
}
int main()
{
// values near the mean are the most likely
// standard deviation affects the dispersion of generated values from the mean
double center = 0.2;
invErr = (center - 0.5) * 2;
std::map<int, int> hist;
float step = 20;
for(int n=0; n<100000; ++n) {
++hist[std::round(f(center) * step)];
}
for(auto p : hist) {
std::cout << std::fixed << std::setprecision(2) << std::setw(2)
<< p.first / step << ' ' << std::string(std::round(p.second/500.0f), '*') << '\n';
}
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8aW9tYW5pcD4KI2luY2x1ZGUgPHN0cmluZz4KI2luY2x1ZGUgPG1hcD4KI2luY2x1ZGUgPHJhbmRvbT4KI2luY2x1ZGUgPGNtYXRoPgpzdGQ6OnJhbmRvbV9kZXZpY2UgcmQ7CnN0ZDo6bXQxOTkzNyBnZW4ocmQoKSk7CnN0ZDo6bm9ybWFsX2Rpc3RyaWJ1dGlvbjw+IGQoMCwxKTsKZG91YmxlIGludkVycjsKCmRvdWJsZSBmKGZsb2F0IHNrZXcpewogICBmbG9hdCB4ID0gZChnZW4pOwogICB3aGlsZSAoeCA8IC0xIHx8IHggPiAxKQogICAgICB4ID0gZChnZW4pOwogICBkb3VibGUgYyA9IGludkVycjsKICAgaWYgKHggPCBjKQogICAgICByZXR1cm4gKHggKyAxKSAqIChza2V3KSAvIChjIC0gKC0xKSk7CiAgIGVsc2UKICAgICAgcmV0dXJuICh4IC0gYykgKiAoMS1za2V3KSAvICgxIC0gYykgKyBza2V3Owp9CmludCBtYWluKCkKewogICAgCiAgICAvLyB2YWx1ZXMgbmVhciB0aGUgbWVhbiBhcmUgdGhlIG1vc3QgbGlrZWx5CiAgICAvLyBzdGFuZGFyZCBkZXZpYXRpb24gYWZmZWN0cyB0aGUgZGlzcGVyc2lvbiBvZiBnZW5lcmF0ZWQgdmFsdWVzIGZyb20gdGhlIG1lYW4KICAgIGRvdWJsZSBjZW50ZXIgPSAwLjI7CiAgICBpbnZFcnIgPSAoY2VudGVyIC0gMC41KSAqIDI7CiAgICBzdGQ6Om1hcDxpbnQsIGludD4gaGlzdDsKICAgIGZsb2F0IHN0ZXAgPSAyMDsKICAgIGZvcihpbnQgbj0wOyBuPDEwMDAwMDsgKytuKSB7CiAgICAgICAgKytoaXN0W3N0ZDo6cm91bmQoZihjZW50ZXIpICogc3RlcCldOwogICAgfQogICAgZm9yKGF1dG8gcCA6IGhpc3QpIHsKICAgICAgICBzdGQ6OmNvdXQgPDwgc3RkOjpmaXhlZCA8PCBzdGQ6OnNldHByZWNpc2lvbigyKSA8PCBzdGQ6OnNldHcoMikKICAgICAgICAgICAgICAgICAgPDwgcC5maXJzdCAvIHN0ZXAgPDwgJyAnIDw8IHN0ZDo6c3RyaW5nKHN0ZDo6cm91bmQocC5zZWNvbmQvNTAwLjBmKSwgJyonKSA8PCAnXG4nOwogICAgfQp9