首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在编译时在C++中生成随机数

在编译时在C++中生成随机数
EN

Stack Overflow用户
提问于 2012-07-16 12:55:12
回答 5查看 17.3K关注 0票数 27

我尝试在编译时使用C++11的random库预先计算随机值。我主要是按照例子来做。我在这里做错了什么?

代码语言:javascript
复制
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窃取的编译时随机数生成器示例,但它可能对任何查找此生成器的人都有用:

代码语言:javascript
复制
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;
    };
};
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2012-07-16 13:02:12

编译时只能计算constexpr函数和常量表达式。这就排除了<chrono><random>

您可以做的是访问PRNG预处理器宏,并定义您自己的由一行constexpr函数组成的__TIME__

票数 27
EN

Stack Overflow用户

发布于 2014-04-14 18:21:52

有一篇关于这个主题的研究论文:Random number generator for C++ template metaprograms包含用于__TIME__技巧的code snippet。它还讨论了支持不同的随机数引擎和分布作为正交选择。

票数 7
EN

Stack Overflow用户

发布于 2015-12-06 11:43:07

我会试着从外部来源把它拉进来。一个非常简单的例子是在compile命令中使用定义的宏变量编译程序。在这里,$RANDOM是unix/linux系统中一个特殊的内置变量,它会自动返回一个随机的16位数字。

代码语言:javascript
复制
g++ -D__RANDOM__=$RANDOM yourprog.cpp -o yourprog

//yourprog.cpp
#include <iostream>
int main() {
  std::cout << "Random variable " << __RANDOM__ << std::endl;
  return 0;
}

您也可以编写自己的脚本或可执行文件来赋值给宏变量。

代码语言:javascript
复制
//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;
}

然后编译为:

代码语言:javascript
复制
g++ DevRandomGenerator.cpp -o DevRandomGenerator
g++ -D__RANDOM__="$(./DevRandomGenerator)" yourprog.cpp -o yourprog

更好的随机生成器是编写一个使用音频和可视输入的程序。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11498304

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档