我需要生成随机数,但范围尽可能广(至少 64 位)。我不在乎分布是否完美,所以std::rand()
会起作用,但它只返回一个int
. 我知道 c++11 具有一些随机数生成能力,可以给出任何大小的数字,但使用起来非常复杂。有人可以发布一个简单的示例,说明如何尽可能简单地使用它以尽可能简单的方式(例如)获得所描述的功能(64 位或更多随机数std::rand()
)?
问问题
29160 次
3 回答
35
这是为此目的使用 C++11 随机数生成的方法(从http://en.cppreference.com/w/cpp/numeric/random/uniform_int_distribution调整):
#include <random>
#include <iostream>
int main()
{
/* Initialise. Do this once (not for every
random number). */
std::random_device rd;
std::mt19937_64 gen(rd());
/* This is where you define the number generator for unsigned long long: */
std::uniform_int_distribution<unsigned long long> dis;
/* A few random numbers: */
for (int n=0; n<10; ++n)
std::cout << dis(gen) << ' ';
std::cout << std::endl;
return 0;
}
而不是unsigned long long
,您可以使用std::uintmax_t
fromcstdint
来获得最大可能的整数范围(不使用实际的大整数库)。
于 2012-12-23T08:34:00.463 回答
15
我们可以轻松地将随机数生成器引擎包装到类似 srand/rand 的方法中,如下所示:
#include <random>
#include <iostream>
struct MT19937 {
private:
static std::mt19937_64 rng;
public:
// This is equivalent to srand().
static void seed(uint64_t new_seed = std::mt19937_64::default_seed) {
rng.seed(new_seed);
}
// This is equivalent to rand().
static uint64_t get() {
return rng();
}
};
std::mt19937_64 MT19937::rng;
int main() {
MT19937::seed(/*put your seed here*/);
for (int i = 0; i < 10; ++ i)
std::cout << MT19937::get() << std::endl;
}
(就像srand
and rand
,这个实现不关心线程安全。)
包装函数非常简单,你可以直接使用引擎。
#include <random>
#include <iostream>
static std::mt19937_64 rng;
int main() {
rng.seed(/*put your seed here*/);
for (int i = 0; i < 10; ++ i)
std::cout << rng() << std::endl;
}
于 2012-12-23T08:36:17.943 回答
3
不是 C++11,但足够简单
((unsigned long long)rand() << 32) + rand()
这里我们将 int64 的两部分生成为 int32
正如所JasonD
指出的,它假设rand()
生成 32 位整数。可以 xor
rand() << x
、rand() << (2*x)
、rand() << (3*x)
等,其中x
<= 位在按数字生成rand()
。也应该没问题。
于 2012-12-23T08:32:08.993 回答