是否有一个函数可以在指定范围内生成 k 个随机数。例如,我想要 0 到 100 之间的 5 个随机数,有或没有替换。
问问题
2322 次
3 回答
6
您可以将std::generate_n与rand()
新的C++11 random number generators中的任何一个或一个生成器一起使用。
于 2012-08-29T16:29:10.880 回答
3
例如,您可以使用 Boost 库来生成随机数。以下代码从 [0, 100] 生成 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);
}
}
注意:示例中不带替换的拒绝采样具有明显的缺点,即很难创建较长的向量。试着从 100 个数字中抽取 99 个,看看我的意思(或者更好地从 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);
}
根据juanchopanza的建议进行编辑:
在 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);
}
g++-4.6
-std=c++0x
如果您添加开关,则可以愉快地编译它。
编辑:利用std::random_shuffle()
(James Kanze的坦克)。
于 2012-08-29T16:37:16.067 回答
-1
是的,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;
}
}
于 2018-10-20T11:32:18.597 回答