我需要std::vector<unsigned int>
用随机值填充一个巨大的(7734500元素),我试图与多个线程并行地实现它以实现更高的效率.这是我到目前为止的代码:
std::random_device rd; // seed generator
std::mt19937_64 generator{rd()}; // generator initialized with seed from rd
static const unsigned int NUM_THREADS = 4;
std::uniform_int_distribution<> initialize(unsigned long long int modulus)
{
std::uniform_int_distribution<> unifDist{0, (int)(modulus-1)};
return unifDist;
}
void unifRandVectorThreadRoutine
(std::vector<unsigned int>& vector, unsigned int start,
unsigned int end, std::uniform_int_distribution<>& dist)
{
for(unsigned int i = start ; i < end ; ++i)
{
vector[i] = dist(generator);
}
}
std::vector<unsigned int> uniformRandomVector
(unsigned int rows, unsigned int columns, unsigned long …
Run Code Online (Sandbox Code Playgroud) 我试图用openCV检测图像中的嘴,所以我使用以下代码:
#include "face_detection.h"
using namespace cv;
// Function detectAndDisplay
void detectAndDisplay(const std::string& file_name, cv::CascadeClassifier& face_cascade, cv::CascadeClassifier& mouth_cascade)
{
Mat frame = imread(file_name);
std::vector<Rect> faces;
Mat frame_gray;
Mat crop;
Mat res;
Mat gray;
cvtColor(frame, frame_gray, COLOR_BGR2GRAY);
equalizeHist(frame_gray, frame_gray);
// Detect faces
face_cascade.detectMultiScale(frame_gray, faces, 1.1, 3, 0 | CASCADE_SCALE_IMAGE, Size(30, 30));
for(unsigned int i=0;i<faces.size();i++)
{
rectangle(frame,faces[i],Scalar(255,0,0),1,8,0);
Mat face = frame(faces[i]);
cvtColor(face,face,CV_BGR2GRAY);
std::vector <Rect> mouthi;
mouth_cascade.detectMultiScale(face, mouthi);
for(unsigned int k=0;k<mouthi.size();k++)
{
Point pt1(mouthi[k].x+faces[i].x , mouthi[k].y+faces[i].y);
Point pt2(pt1.x+mouthi[k].width, pt1.y+mouthi[k].height);
rectangle(frame, pt1,pt2,Scalar(0,255,0),1,8,0);
}
}
imshow("Frame", …
Run Code Online (Sandbox Code Playgroud) 在我的项目中,我有一些包含方法的头文件(例如用于模板类).所有这些头文件都包含在一个文件中header.h
,然后包含在每个cpp文件中.这样,我必须在一个地方更改代码.还有一些.h
没有相应.cpp
文件的文件.
然后我有这个makefile:
# Makefile
.PHONY: run clean rebuild
CC = g++
CFLAGS = -Wall -Ofast -std=c++0x -pthread
RM = rm -f
EXEC = main
SRC = $(wildcard *.cpp)
OBJ = $(SRC:.cpp=.o)
$(EXEC): $(OBJ)
$(CC) $(CFLAGS) -o $@ $(OBJ)
%.o: %.cpp
$(CC) $(CFLAGS) -c $^
run: $(EXEC)
./$(EXEC)
clean:
$(RM) $(EXEC) *.o *.gch *~
rebuild: clean $(EXEC)
Run Code Online (Sandbox Code Playgroud)
一切正常,除了一个小而烦人的细节:如果我修改一个cpp文件,那么我可以做make
,一切都正确更新,但如果我修改一个头文件,那么我必须删除所有内容并从头开始重新编译(这是我有那个丑陋的rebuild
目标的原因),否则编辑将没有任何效果.
有没有办法在不重组整个代码的情况下让事情变得更好?
我试过这个makefile
.PHONY: run clean rebuild
CC = g++
CFLAGS = -Wall …
Run Code Online (Sandbox Code Playgroud) 我需要许多加密安全的数字,因此我正在考虑从中提取随机性/dev/urandom
,然后将其“转换”为(例如)unsigned long long int
。我想它应该非常有效,而且似乎在密码上是安全的,但是我将来会对此进行更多研究。
现在的问题是:我该怎么办?
我发现此代码:
char * block;
short size = 1;
ifstream urandom("/dev/urandom", ios::in|ios::binary);
urandom.read(block,size);
urandom.close();
Run Code Online (Sandbox Code Playgroud)
是否有意义?以及如何将我得到的转换为我想要的类型?
random
C ++ 11的接口根据评论的建议,我尝试对整数使用均匀分布并将其random_device
初始化为/dev/urandom
。这是代码:
std::uniform_int_distribution<unsigned int> dist(0, modulus-1);
std::random_device urandom("/dev/urandom");
for(unsigned int i = start ; i < end ; ++i)
{
vector[i] = dist(urandom);
}
Run Code Online (Sandbox Code Playgroud)
问题在于此代码比以前(我使用的是xorshift128 +生成器)慢了大约1000倍:5毫秒vs. 5秒钟。这正常吗?老实说,我认为从中传输字节/dev/urandom
并将其转换为字节的unsigned int
速度会更快...我是否缺少某些内容?