在不同的浮点精度之间切换时,使用我自己的std :: mersenne_twister_engine模板参数

时间:2019-05-23 20:31:28

标签: c++ c++11 random mersenne-twister

std::mt19937std::mersenne_twister_engine的typedef。如果我在采样中在不同浮点精度之间切换,是否应该为后者使用自己的模板参数?如果可以,怎么办?

现在我有这样的东西

#include <random>
#include <iostream>

int main()
{
    using float_type = double;

    std::random_device rd;  
    std::mt19937 gen(rd()); 
    std::uniform_real_distribution<float_type> dis(1.0, 2.0);
    for (int n = 0; n < 1e6; ++n) {
        std::cout << dis(gen) << ' ';
    }
    std::cout << '\n';
}

但是当我将using float_type = double;切换为using float_type = float;时,并没有太大的提升。实际上,在我拥有的其他代码中,使用float实际上要慢得多!

如果有帮助,这里是一个makefile。在与time ./prog一起编译后,我使用了make作为粗略计时器,并且我正在运行Ubuntu 18.04.2 LTS,并且我的处理器是Intel®Xeon(R)CPU E3-1241 v3 @ 3.50GHz× 8。

PROG = prog
SRCS = main.cpp
OBJS = main.o
CXX = g++
CXXFLAGS = -std=c++11 -O3 $(INCLUDES) -pg


all: $(PROG)

$(PROG): $(OBJS)
        $(CXX) -o $@ $(OBJS) 

main.cpp :
        $(CXX) $(CXXFLAGS) -c 

main.o : main.cpp
        $(CXX) $(CXXFLAGS) -c main.cpp

.PHONY: clean
clean:
        rm -f $(PROG) $(OBJS) 

1 个答案:

答案 0 :(得分:1)

  

如果我在采样中在不同的浮点精度之间进行切换,应该为后者使用自己的模板参数吗?如果可以,怎么办?

当然,您可以使用64位引擎进行双精度采样(尾数为53位长),并使用32位引擎进行浮点采样。

#define USE_DOUBLES

...

#ifdef USE_DOUBLES
    using float_type = double;
    using rng        = std::mt19937_64;
#else
    using float_type = float;
    using rng        = std::mt19937;
#endif

mt19937_64是MT的别名,每次呼叫生成64位随机性