我正在尝试在编译时使用C++ 11的random
库预先计算随机值。我主要关注以下示例。我在这里做错了什么?
using namespace std;
#include <iostream>
#include <vector>
#include <random>
vector<double> rands;
typedef std::mt19937_64 RNG;
uint64_t seed_val;
RNG rng;
void initialize() {
rng.seed(seed_val);
}
constexpr vector<double> generate_random( ) //size_t numbers)
{
int numbers = 1000;
std::uniform_real_distribution<double> zero_one(0.0, 1.0);
for (unsigned int i = 0; i < numbers; i++) {
double rand_num = zero_one(rng);
rands.push_back( rand_num );
}
return rands;
}
int main()
{
cout << "TMP rands";
for_each( rands.begin(), rands.end(), [] (double value)
{
cout<<value<<endl;
});
}
这是一个从here毫不知情地偷来的编译时随机数生成器示例,但认为它对查找此信息的任何人可能有用:
template<u32 S, u32 A = 16807UL, u32 C = 0UL, u32 M = (1UL<<31)-1>
struct LinearGenerator {
static const u32 state = ((u64)S * A + C) % M;
static const u32 value = state;
typedef LinearGenerator<state> next;
struct Split { // Leapfrog
typedef LinearGenerator< state, A*A, 0, M> Gen1;
typedef LinearGenerator<next::state, A*A, 0, M> Gen2;
};
};
最佳答案
在编译时只能评估constexpr
函数和常量表达式。那排除了<chrono>
和<random>
。
您可以做的是访问__TIME__
预处理程序宏,并定义由一行constexpr
函数组成的自己的PRNG。
关于c++ - 在编译时使用C++生成随机数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11498304/