C++生成随机数

阅读量: searchstar 2020-05-04 21:50:19
Categories: Tags:

大段随机二进制

思路:先用std::random_device生成真随机数,用来初始化长周期随机数发生器std::mt19937,然后再用std::mt19937来不断生成随机数。

生成大段随机二进制的部分C++17之后可以用这些:

https://en.cppreference.com/w/cpp/algorithm/generate

https://en.cppreference.com/w/cpp/algorithm/generate_n

否则只能手写了。代码:

#include <assert.h>
#include <random>

std::random_device rd;
typedef std::mt19937 RandEngine;
//RandEngine e(std::random_device()());
RandEngine e(rd());
//Generate long random binary result
void genrand(void *dest, size_t n) {
typedef uint32_t res_t;
assert(n >= sizeof(res_t) &&
"This function is designed for generating long random binary result, please use other function");
assert(n % sizeof(res_t) == 0);

res_t *i = reinterpret_cast<res_t *>(dest);
res_t *j = reinterpret_cast<res_t *>((uint8_t*)dest + n);
for (; i < j; ++i) {
*i = e();
}
}

(坑点)不能这样:

typedef RandEngine::result_type res_t;

因为标准库里的mt19937是用来生成32bit的伪随机数的,而RandEngine::result_type有可能是64bit的。

随机十进制字符串

template <typename Engine>
std::string rand_digits(Engine e, size_t n) {
std::uniform_int_distribution<char> dist(0, 9);
std::string ret;
ret.reserve(n);
while (n--) {
ret.push_back(dist(e) + '0');
}
return ret;
}

参考

http://www.cplusplus.com/reference/random/mt19937/
What is uint_fast32_t and why should it be used instead of the regular int and uint32_t?