我希望随机数的生成可以通过变量来控制。例如,如果我说 100,数字应该以最大随机性生成,如果我说 50,数字不应该是“随机的”。如果我说“0”,可能随机数根本不应该是随机的 - 也许生成的所有数字都是相同的。
知道我可以用什么来生成这样的受控随机数吗?知道是否某些 C++ 内置库或 Boost 库可以做到这一点吗?
最好有一种方法来重新生成相同的随机数序列,因此为生成器提供种子的方法也很好。
最佳答案
您描述要求的方式似乎表明使用正态分布(又名高斯分布)可能是可行的方法。它有两个参数:均值和标准差。如果您将标准偏差设置得非常低,您会得到可能非常接近均值的随机值。如果将其设置为较大的值,它们的分布范围会更广。
在 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(即,用您的措辞来说,“随机性”很低),而第二行中的数字分布范围更广。
(编辑:当然,这些数字的随机性并没有真正受到影响。只是标准偏差参数使这些值更有可能出现在更小的(stddev低)或更宽的范围内(stddev 高)数字范围。)
关于c++ - 如何编写一个可控的随机数生成器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12966731/