要件を説明する方法は、正規分布(別名ガウス分布)を使用することが道のりである可能性があることを示唆しているようです。これには、平均と標準偏差の2つのパラメーターがあります。標準偏差を非常に低く設定すると、おそらく平均に非常に近いランダムな値が得られます。大きな値に設定すると、より広く分散されます。
C ++ 11では、標準ライブラリから正規分布を利用できます。C ++ 11がオプションでない場合は、Boostライブラリにもオプションがあります。
次にいくつかのサンプルコードを示します。
#include <iostream>
#include <iomanip>
#include <string>
#include <map>
#include <random>
#include <cmath>
#include <iomanip>
int main()
{
std::random_device rd;
std::mt19937 gen(rd());
std::cout << std::fixed << std::setprecision(3);
/* Mean 5, standard deviation very low (0.002): */
std::normal_distribution<> d1(5,0.002);
for (int i = 0 ; i < 20 ; ++i)
std::cout << std::setw(7) << d1(gen) << " ";
std::cout << std::endl;
/* Mean 5, standard deviation relatively high (2.0): */
std::normal_distribution<> d2(5,2);
for (int i = 0 ; i < 20 ; ++i)
std::cout << std::setw(7) << d2(gen) << " ";
std::cout << std::endl;
return 0;
}
出力は次のとおりです。
4.998 5.003 5.001 5.002 5.001 5.001 4.998 5.000 4.999 5.001 5.000 5.003 4.999 5.000 5.001 4.998 5.000 4.999 4.996 5.001
2.781 3.795 5.669 -0.109 7.831 3.302 3.823 4.439 4.672 4.461 6.626 5.139 6.882 5.406 6.526 5.831 6.759 2.627 3.918 4.617
ご覧のとおり、最初の行ではすべての数値が5に非常に近く(つまり、「ランダム性」が低い)、2番目の行では数値がはるかに広く広がっています。
(編集:もちろん、これらの数値のランダム性は実際には影響を受けません。標準偏差パラメーターによって、値がより小さな(stddev low)またはより広い(stddev high)範囲の数値で現れる可能性が高くなるだけです。)