C++笔记121121
这篇晚上回来重写,先吐个槽.
今年上半年的时候面quant问我讲virtual constructor...
印象里标准C++里根本没这东西,完全不知所以然,如今看了C++ Design Patterns这书才知道都是被这书惹的祸,标题叫virtual constructor其实讲的都是virtual copy constructor,而且严格说来只能叫做用virtual机制实现的clone()函数......能不能不要这么坑爹。
--------------------------------分割线------------------------------------
下面谈一下随机数的种子的问题。
如果经常用C++作MonteCarlo,所以必须选一个好的随机数种子。传统的常见选择方案是这样的
#include<cstdlib> #include<ctime> #include<iostream> using namespace std; int main() { srand(time(0)); for(int i = 0; i < 10; ++i) cout<<rand()/static_cast<double>RAND_MAX<<'\t'<<flush; return 0; }
这个选择有一个问题,如果在1秒内两次运行这个程序,那么结果就不会发生变化,而且就算在间隔1秒以上运行,结果也不好。你会发现第一个值总是变化不那么大。
解决这个办法网上有很多,取CPU时钟的也好,用一些特别复杂的种子的也好。我觉得就普通人来说,其实最简单的一个办法是用windows的库函数,可以简单的精确到毫秒级的种子,而且简单不复杂,好记实用。只需修改如下:
#include<iosteam> #include<cstdlib> #include<windows.h> using namespace std; int main() { srand(::GetTikCount()); for(int i=0; i<10; ++i) cout<<rand()/static_cast<double>RAND_MAX<<'t'<<flush; return 0; }
GetTikCount函数返回的是操作系统启动到当前的时间,单位为毫秒。当然如果愿意的话还可以用time(0)*GetTikCount()来增加随机性。当然这个东西不是标准C++里的,跨平台的时候要想其它办法。但是自己用的话基本上够了。如果在Linux下做这件事,自然有别的做法。个人认为无伤大雅。