C++11 random numbers
C++11 random numbers
我需要生成随机数,但从尽可能宽的范围(至少64位)。我不关心分布是否完美,所以std::rand()
可以工作,但它只返回int
。我知道c++11有一些随机数生成功能,可以给出任何大小的数字,但使用起来非常复杂。有人可以张贴一个简单的例子,如何使用它尽可能简单地获得所描述的功能(64位或更多的随机数)在尽可能简单的方式(如std::rand()
)?
这是如何使用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;
}
您可以使用cstdint
中的std::uintmax_t
而不是unsigned long long
来获得最大可能的整数范围(不使用实际的大整数库)。
我们可以很容易地将随机数生成器引擎包装成像这样的类rand/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
和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;
}
不是c++ 11,但足够简单
((unsigned long long)rand() << 32) + rand()
这里我们生成了int64的两个部分作为int32的
如JasonD
指出的,它假设rand()
生成32位整数。这是可能的rand() << x
, rand() << (2*x)
, rand() << (3*x)
等,其中x
<= bit's由rand()
number '生成。
相关文章:
- <random>在实践中应该实际使用哪个随机数引擎? std::mt19937?
- 如何计算"numbers in for"的数量
- 是否可以为boost::random::uniform_int_distribution<>设置确定性种子?
- 'generate'不是窗口头文件中'std::random_device'的成员<random>
- 数组打印"random"值时出现问题
- 使用""的不可重现的随机数<random>
- <random> 尽管不是常量,但所有发行版都是线程安全的吗?
- 从时间生成'random'数字?
- "How to make a recursive call for palindrom numbers without reverse function in c++?"
- 无法在 c++ 中包含"random"头文件
- Nemiver 找不到文件 /build/glibc-LK5gWL/glibc-2.23/stdlib/random.c
- 如何在 c++ 中正确读取 GRC 块"Random Source"的字节输出数据到自己的 OOT 块中?
- Large digit numbers
- "sum root to leaf numbers"问题的解决方案
- 如何从C++<random>获得一致的行为
- 为什么 random() 在窗口中不起作用
- c++ random numbers srand
- C++ Random numbers 0 - 16
- C++ random numbers
- C++11 random numbers