我已经用Java编程了三年,并且一直使用Math.random()来获取一个随机数。我是C ++的新手,我想知道是否有相同的东西但是在C ++中呢?我可以使用的特定功能或方法?还包括一个解释。非常感谢!
答案 0 :(得分:3)
C ++提供了一个相当不错的随机数库<random>
,但它还没有那种简单的API初学者通常想要的。如下所示,生成这样的API很容易,并且希望在某些时候包含一些这样的API。
C ++ API将随机数生成分为两部分,即“随机性”源,以及将随机性转换为具有特定分布的数字的机制。随机数的许多基本用法并不特别关心“随机性”的来源有多好(或快或小),并且它们只需要“均匀”分布。因此,通常推荐的随机源是“Mersenne Twister”引擎。您可以创建其中一个并将其播种:
#include <random>
int main() {
std::mt19937 eng{42};
}
现在eng
是一个可以传递并用作随机位源的对象。它是一个值类型,因此您可以复制它,分配它等,就像正常值一样。在线程安全方面,访问此值就像访问任何其他值一样,因此如果您需要多个线程,则应该在每个线程上放置引擎或使用互斥。
要将引擎中的数据转换为随机值,请使用分发对象。典型用途需要“均匀”分布,因此对于整数值,请使用std::uniform_int_distribution<int>
。
std::uniform_int_distribution<int> dice{1, 6};
分发对象是一个函数对象,您可以通过调用它并从中传递它将使用的随机源来获取它的值:
auto die_roll = dice(eng);
要记住的一件事是,生成随机值的数学应该封装在分布对象中。如果您发现自己对结果进行了某种转换,那么您可能应该使用不同的分布。不要做dist(eng) % 10
或dist(eng) / 6.0 + 10.0
之类的事情。库中提供了其他几个发行版,包括用于生成具有各种发行版的浮点值的发行版。
这是一种非常简单的方法来包装<random>
功能以便简单使用:
#include <iostream>
#include <random>
std::mt19937 seeded_eng() {
std::random_device r;
std::seed_seq seed{r(), r(), r(), r(), r(), r(), r(), r()};
return std::mt19937(seed);
}
class Random {
std::mt19937 eng = seeded_eng();
public:
auto operator()(int a, int b) {
std::uniform_int_distribution<int> dist(a, b);
return dist(eng);
}
};
int main() {
Random random;
for (int i = 0; i < 10; ++i) {
std::cout << "Dice: " << random(1, 6) << " " << random(1, 6) << '\n';
}
}
答案 1 :(得分:1)
#include <iostream>
#include <ctime>
int main()
{
srand((unsigned int) time (NULL)); //activates the generator
//...
int a = rand()%10; //gives a random from 0 to 9
double r = ((double) rand() / (RAND_MAX)); //gives a random from 0 to 1
int max, min;
//...
int c = (rand()%(max - min)) + min; //gives a random from min to max
//...
return 0;
}
这些方式最简单。 有时它意味着&#34;最好的&#34;,有时 - 不是。
答案 2 :(得分:0)
1.srand((unsigned)time(0))将确保每次运行程序时rand()函数将获得一个新种子,导致它产生不同的或“随机”输出。如果没有stand((无符号)时间(0)),rand()将产生相同的输出。
2.int Number,用于存储rand()函数生成的随机数。 rand()%27将为您提供数字0-26。
#include <iostream>
#include <ctime>
int main()
{
srand((unsigned)time(0))
int Number = ((rand() % 27));
cout << Number << endl;
return 0;
}
答案 3 :(得分:0)
这是一个简单的解决方案。函数random是重载的。一个实例用于获取整数的随机数生成器。另一个实例用于获取双精度的随机数生成器。拥有这两个函数后,应用程序变得相当简单,就像在main函数中可以看到的那样。
#include <algorithm>
#include <functional>
#include <iostream>
#include <iterator>
#include <numeric>
#include <ostream>
#include <random>
// Single global engine, a better version of std::rand
std::mt19937 engine{ std::random_device()() };
// Returns a generator producing uniform random integers in the closed range [a, b]
std::function<int()> random(int a, int b)
{
auto dist = std::uniform_int_distribution<>(a, b);
return std::bind(dist, std::ref(engine));
}
// Returns a generator producing uniform random doubles in the half-open range [x, y)
std::function<double()> random(double x, double y)
{
auto dist = std::uniform_real_distribution<>(x, y);
return std::bind(dist, std::ref(engine));
}
int main()
{
const auto no_iterations = int{ 12 };
auto dice = random(1, 6);
// Roll the dice a few times and observe the outcome
std::generate_n(std::ostream_iterator<int>(std::cout, " "),
no_iterations, dice);
std::cout << std::endl;
// U is a uniform random variable on the unit interval [0, 1]
auto U = random(0.0, 1.0);
// Generate some observations
std::vector<double> observations;
std::generate_n(std::back_inserter(observations), no_iterations, U);
// Calculate the mean of the observations
auto sum = std::accumulate(observations.cbegin(), observations.cend(), 0.0);
auto mean = sum / no_iterations;
std::cout << "The mean is " << mean << std::endl;
return 0;
}