c – 无偏随机数发生器

c – 无偏随机数发生器,第1张

概述我使用以下代码在域中生成随机数.当我绘制它们时,它们看起来分组在右边.我可以告诉你我的情节,但我不知道如何上传它.基本上我将一些数据值与相应的点相关联.你能告诉我怎样才能纠正它?我的完整代码是 #include <iostream>#include <cmath>#include <fstream>#include <sstream>#include <string>#include < 我使用以下代码在域中生成随机数.当我绘制它们时,它们看起来分组在右边.我可以告诉你我的情节,但我不知道如何上传它.基本上我将一些数据值与相应的点相关联.你能告诉我怎样才能纠正它?我的完整代码是

#include <iostream>#include <cmath>#include <fstream>#include <sstream>#include <string>#include <cstdlib>#include <cstdio>#include <time.h>using namespace std;string int2string1( int l );string int2string2( int m );int main (){    ofstream outfile;    ofstream myimp;    string filename;    srand((unsigned)time(0));    int nx = 400;    int ny = 200;    int i,j,ix,iy,xm,ym,nimp,nfam[nx][ny];    float vo,rnd,rr,rad,sig,vimp[nx][ny];    for (i=0; i<nx; i++)    {        for (j=0; j<ny; j++)        {            vimp[i][j] = 0.0;        }    }    rad = 5.0;    xm = 0;    ym = 0;    vo = 0.08;    sig = 4.0;    myimp.open("imp.dat");    for(i=1; i<nx-1; i++)    {        for(j=1; j<ny-1; j++)        {            rnd = (random() %1000 + 1)*1.0/1000.0;            if(rnd>0.99)            {                xm = random() % 398 + 1;              /***1 through 399 ***/                ym = random() % 198 + 1;              /***1 through 199 ***/                for(ix=xm-5; ix<=xm+5; ix++)                {                    for(iy=ym-5; iy<=ym+5; iy++)                    {                        rr = sqrt(pow(ix-xm,2.)+pow(iy-ym,2.));                        if(rr<=rad)                        {                            vimp[ix][iy] = vo*1.6e-19;                        }                    }                }            }            myimp<<i<<"\t\t"<<j<<"\t\t"<<xm<<"\t\t"<<ym<<"\t\t"<<nfam[i][j]<<"\t\t"<<vimp[i][j]*6.23e18<<"\n";        }    }    myimp.close();    return 0;}@H_419_12@解决方法 基本上,如果RAND_MAX不是N的倍数,则rand()%N表达式引入偏差.它以[0,RAND_MAX]将数字以非均匀方式投影到范围[0,N]上.  

假设RAND_MAX = 4且N = 2.然后,有3个数字产生0(0,2和4),2个数字产生1(1和3).因此,你得到60%的变化0和40%获得1的机会.

实现从[0,RAND_MAX]到[0,N]的无偏投影的正确方法是重复调用rand(),直到随机值在所需的间隔内.请参阅Java中的documentation for Random.nextInt()(致Oli Charlesworth的信用链接).

假设,对于纯粹的执行速度,您希望避免多次调用rand(),生成最小偏差的方法是使用中间双数,例如:

double myrand (){    return double(rand()) / double(RAND_MAX);}int myrand ( int max ){    return int(myrand() * double(max));}@H_419_12@  

编辑:这是一个简单的类,它将rand()函数的输出投影到范围[0,N],其偏差不小于rand().

class BoundedRandom{    const int m_maximum;    const int m_divisor;public:    BoundedRandom ( int maximum )        : m_maximum(maximum),m_divisor(RAND_MAX/(maximum+1))    {}    int operator() ()    {        int result = rand() / m_divisor;        while ( result > m_maximum ) {            result = rand() / m_divisor;        }        return (result);    }};@H_419_12@  

注意:未经测试或调试.

您可以像这样使用此生成器:

BoundedRandom randomx(398);BoundedRandom randomy(198);// ... xm = randomx() + 1; // 1 through 399 ym = randomy() + 1; // 1 through 199@H_419_12@                            	          总结       

以上是内存溢出为你收集整理的c – 无偏随机数发生器全部内容,希望文章能够帮你解决c – 无偏随机数发生器所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1223808.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存