std::mt19937
是std::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)
答案 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位随机性