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下做这件事,自然有别的做法。个人认为无伤大雅。

posted @ 2012-11-21 16:32  hilbertan  阅读(241)  评论(0编辑  收藏  举报