正文

规格化的随机变量2005-12-18 15:00:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/rickone/8476.html

分享到:

规格化就是把随机变量的取值限制在[0,1)之间。 尝试过从双精的标准出发得到随机数,但那样很难保证其等概率性,于是还是从rand()的标准出发吧。 ANSI C给出了标准的随机变量计算方法和函数。其算法可以查相关资料,现只给出函数原型: int rand(void); 返回值为int型,在WIN32里是4个字节,但实际上有用部分只有前15bit,生成的随机数是一个0~0x7FFF(十进制32767)的随机正整数。这里假设由标准算法生成的随机数的这15个bit是等概率得到0或1的,那么就用它‘拼’成更高一些位数的随机数,于是给出下面的算法: double drand(void){   return (double)(            rand()<<15 | rand()           ) /           (double)0x40000000;} rand()<<15 | rand() 将拼成一个30bit的随机整数,取值0~3FFFFFFF,于是相除之后将得到大于等于0小于1的小数。 使用得到任意范围[a,b)内的随机浮点数:double i=a+drand()*(b-a);float  j=a+(float)(drand()*(b-a)); 得到任意范围[a,b]内的随机整数:int i=a+(int)(drand()*(1+b-a)); 测试 接合前面的算法,给出如下的测试用例:double frand(double (*p)(double),double h){  double x=drand(),y=drand()*h;  if(y<p(x))return x;  return frand(p,h);}double testPfunction(double x){  if(x<0.333333)return 0.5;  if(x<0.666667)return 1;  return 1.5;}void main(void){  int n,v[100]={0};  cin>>n;  for(int i=0;i<n;++i)    v[(int)(frand(testPfunction,2)*100)]++;  for(int j=0;j<100;++j)    cout<<v[j]<<endl;}测试结果1000044605454665340494149514664494645536459555557475258534560435738504482758710910497901039510010110411186106971048310010210910399971151099798941219711210699148154153172134163145145149137124156144154125158138138136162149134171159153159161134155135134163165

阅读(7765) | 评论(1)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

loading...
您需要登录后才能评论,请 登录 或者 注册