c – 无偏随机数发生器
发布时间:2020-12-16 10:54:53 所属栏目:百科 来源:网络整理
导读:我使用以下代码在域中生成随机数.当我绘制它们时,它们看起来分组在右边.我可以告诉你我的情节,但我不知道如何上传它.基本上我将一些数据值与相应的点相关联.你能告诉我怎样才能纠正它?我的完整代码是 #include iostream#include cmath#include fstream#incl
我使用以下代码在域中生成随机数.当我绘制它们时,它们看起来分组在右边.我可以告诉你我的情节,但我不知道如何上传它.基本上我将一些数据值与相应的点相关联.你能告诉我怎样才能纠正它?我的完整代码是
#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<<"tt"<<j<<"tt"<<xm<<"tt"<<ym<<"tt"<<nfam[i][j]<<"tt"<<vimp[i][j]*6.23e18<<"n"; } } myimp.close(); return 0; } 解决方法
基本上,如果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 假设,对于纯粹的执行速度,您希望避免多次调用rand(),生成最小偏差的方法是使用中间双数,例如: double myrand () { return double(rand()) / double(RAND_MAX); } int myrand ( int max ) { return int(myrand() * double(max)); } 编辑:这是一个简单的类,它将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); } }; 注意:未经测试或调试. 您可以像这样使用此生成器: BoundedRandom randomx(398); BoundedRandom randomy(198); // ... xm = randomx() + 1; // 1 through 399 ym = randomy() + 1; // 1 through 199 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |