我需要生成随机数,但是从同样宽的范围尽可能(64位至少)。 我不在乎,如果分配是完美的,所以std::rand()
会工作,但它只返回一个int
。 据我所知,C ++ 11有一定的随机数生成功能,可以给任何大小的数字,但非常复杂的使用。 有人可以张贴的如何使用它尽可能简单地获得在简单的方式描述的功能(64位以上的随机数)尽可能简单的例子(如std::rand()
Answer 1:
这是如何使用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
从cstdint
获得尽可能大的整数的范围(不使用实际的大整数库)。
Answer 2:
我们可以很容易地换一个随机数发生器引擎进入函数srand /兰特样的方法是这样的:
#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
和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;
}
Answer 3:
不是C ++ 11,但很容易
((unsigned long long)rand() << 32) + rand()
在这里,我们生成的Int64的两个部分INT32的
正如JasonD
指出的那样,它假定rand()
生成的32位整数。 这spossible到异或rand() << x
, rand() << (2*x)
rand() << (3*x)
等,其中, x
<=位在由生成rand()
number`。 它应该是OK了。
文章来源: C++11 random numbers