我尝试在编译时使用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;
};
};
发布于 2012-07-16 13:02:12
编译时只能计算constexpr
函数和常量表达式。这就排除了<chrono>
和<random>
。
您可以做的是访问PRNG预处理器宏,并定义您自己的由一行constexpr
函数组成的__TIME__
。
发布于 2014-04-14 18:21:52
有一篇关于这个主题的研究论文:Random number generator for C++ template metaprograms包含用于__TIME__
技巧的code snippet。它还讨论了支持不同的随机数引擎和分布作为正交选择。
发布于 2015-12-06 11:43:07
我会试着从外部来源把它拉进来。一个非常简单的例子是在compile命令中使用定义的宏变量编译程序。在这里,$RANDOM
是unix/linux系统中一个特殊的内置变量,它会自动返回一个随机的16位数字。
g++ -D__RANDOM__=$RANDOM yourprog.cpp -o yourprog
//yourprog.cpp
#include <iostream>
int main() {
std::cout << "Random variable " << __RANDOM__ << std::endl;
return 0;
}
您也可以编写自己的脚本或可执行文件来赋值给宏变量。
//DevRandomGenerator.cpp
#include <iostream>
#include <fstream>
class DevRandom {
private:
std::ifstream stream;
public:
DevRandom() {
stream.open("/dev/urandom",std::ios::in|std::ios::binary);
}
unsigned int unsignedInt() {
unsigned int u = 0;
stream.read((char*)&u, sizeof(unsigned int));
return u;
}
};
int main() {
DevRandom rand;
std::cout << rand.unsignedInt() << std::endl;
return 0;
}
然后编译为:
g++ DevRandomGenerator.cpp -o DevRandomGenerator
g++ -D__RANDOM__="$(./DevRandomGenerator)" yourprog.cpp -o yourprog
更好的随机生成器是编写一个使用音频和可视输入的程序。
https://stackoverflow.com/questions/11498304
复制相似问题