C++中的随机函数

random function in C++

本文关键字:函数 随机 C++      更新时间:2023-10-16

是否有一个函数可以在指定范围内生成k个随机数。例如,我想要5个介于0到100之间的随机数,可以替换也可以不替换。

您可以将std::generate_n与rand()或新的C++11随机数生成器中的生成器一起使用。

有一个Boost库,例如,您可以使用它来生成随机数。以下代码从[0100]生成5个随机数,并替换

#include <vector>
#include <boost/random/mersenne_twister.hpp>
#include <boost/random/uniform_int_distribution.hpp>
const int numWantedNumbers = 5;
int main()
{
    boost::random::mt19937 generator;
    boost::random::uniform_int_distribution<> distribution(0, 100);
    std::vector<int> result;
    for (int i = 0; i < numWantedNumbers; ++i)
        result.push_back(distribution(generator));
}

如果要生成不替换的数字,只需检查它们是否为仍然可用:

#include <algorithm>
#include <vector>
#include <boost/random/mersenne_twister.hpp>
#include <boost/random/uniform_int_distribution.hpp>
const int numWantedNumbers = 5;
int main()
{
    boost::random::mt19937 generator;
    boost::random::uniform_int_distribution<> distribution(0, 100);
    std::vector<int> result;
    while (result.size() < numWantedNumbers)
    {
        int number = distribution(generator);
        if (std::find(result.begin(), result.end(), number) == result.end())
            result.push_back(number);
    }
}

注意:没有替换的示例中的拒绝采样有一个明显的缺点,即很难创建较长的向量。试着抽出99在100个数字中,看看我的意思(或者更好的是从10000中抽取9999)。如果是个问题,我建议创建一个所有可能数字的随机排列然后按照要求的大小切割矢量:

#include <algorithm>
#include <vector>
#include <boost/random/mersenne_twister.hpp>
#include <boost/random/uniform_int_distribution.hpp>
const int numWantedNumbers = 5;
int main()
{
    boost::random::mt19937 generator;
    boost::random::uniform_int_distribution<> distribution(0, 100);
    // Generate a vector with all possible numbers and shuffle it.
    std::vector<int> result;
    for (int i = 0; i <= 100; ++i)
        result.push_back(i);
    for (int i = 0; i <= 100; ++i)
    {
        int x = distribution(generator);
        std::swap(result[i], result[x]);
    }
    // Truncate to the requested size.
    result.resize(numWantedNumbers);
}

根据juancopanza的建议进行编辑

在C++11中,最后一个变体看起来像这个

#include <algorithm>
#include <random>
#include <vector>
const int numWantedNumbers = 5;
int main()
{
    std::random_device device;
    std::mt19937 generator(device());
    std::uniform_int_distribution<> distribution(0, 100);
    // Generate a vector with all possible numbers and shuffle it.
    std::vector<int> result;
    for (int i = 0; i <= 100; ++i)
        result.push_back(i);
    std::random_shuffle(result.begin(), result.end());
    // Truncate to the requested size.
    result.resize(numWantedNumbers);
}

如果您添加了-std=c++0x开关,g++-4.6会愉快地编译它。

编辑:使用std::random_shuffle()(詹姆斯·坎泽的坦克)。

是的,C++中有一个rand()函数,它可以用于在程序中包含cstdlib头文件。您可以使用以下代码来实现您的程序。

#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
int main()
{
  int max {100};
  int min {0};
  int number;
  int count = 5; //assuming that only 10 numbers we need to print
  srand(time(0));
  for(int i=1;i<=count;i++)
  {
      number = rand() % (max - min +1) + min;``
      cout<<number<<endl;
  }
}