如何编写可控的随机数发生器?

Moe*_*oeb 2 c++ random boost

我希望随机数生成可以用变量控制.例如,如果我说100,则应生成具有最大随机性的数字,如果我说50,则数字不应为"随机".如果我说'0',可能随机数根本不应该是随机数 - 也许所有生成的数字都是相同的.

知道我可以用什么来生成像这样的受控随机数?有没有想过是否有一些C++内置库,或者Boost库可以做到这一点?

有一种方法可以重新生成相同的随机数序列,因此种子生成器的方法也会很好.

jog*_*pan 5

您描述您的要求的方式似乎表明使用正态分布(也称为高斯分布)可能是要走的路.它有两个参数:平均值和标准偏差.如果将标准偏差设置得非常低,则会得到可能非常接近平均值的随机值.如果将其设置为较大的值,则可以更广泛地分发它们.

在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;
}
Run Code Online (Sandbox Code Playgroud)

这是输出:

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
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,在第一行中,所有数字都非常接近5(即,使用您的措辞,"随机性"较低),而在第二行中,数字的传播范围更广.

(编辑:当然,这些数字的随机性并没有真正受到影响.只是标准差参数使得值更可能出现在较小(stddev low)或更宽(stddev high)的数字范围内.)