C++中的随机函数
random function in C++
是否有一个函数可以在指定范围内生成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;
}
}
相关文章:
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- 循环中的随机函数
- 在c++构造函数中使用随机字符串生成器
- 将字符随机转换为大写的函数
- 如何使用要传递给 mt19937 的可选随机种子参数设计函数
- 使用指针在分区函数中实现随机分区点
- 如何使用可选的随机种子参数创建 roll_die() 函数
- 如何调用随机函数
- 如何在 C++ 中获取随机函数的周期性
- C++ Arduino - 随机函数不起作用
- RCPP 函数,用于在 4 个方向上生成随机游走
- 动态数组传递给 main 中用随机值填充的函数,返回值3221226356
- 通过函数传递随机引擎-为什么不同的编译器表现不同
- 朋友函数随机行为
- 为什么我的函数名称中会随机出现一个额外的字母
- 如何编写一个递归函数,以随机的方式混淆从0到6的数字
- 我在运行函数 GetVolumeInformation() 时得到非常随机的结果
- 从 C# 模块调用C++函数引发随机崩溃
- 除法函数随机整数需要打印出商和余数
- c++分裂函数随机崩溃