c++ - 如何编写一个可控的随机数生成器?

标签 c++ boost random

我希望随机数的生成可以通过变量来控制。例如,如果我说 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/

相关文章:

c++ - 二进制永远不会构建

c++ - 如何逐行读取文件,以及每一行中的内容都用空格分隔并写入新文件中

gcc - 与 OS X 10.10.2 的 "__mpf_struct"相关的 undefined symbol 错误

c++ - 如何提取Boost库中引用段的点

javascript - 当我随机化银行变量时,bankMoney 变为 NaN

c++ - 创建无重复的随机数序列

C++ 跨平台后台任务

c++ - 即使使用 boost 也不会绑定(bind)到成员函数

生成与指定百分比成比例的序列的算法

c++ - 为什么我不能用统一初始化初始化初始化列表中的引用?