#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 – 无偏随机数发生器所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
c – 无偏随机数发生器
概述我使用以下代码在域中生成随机数.当我绘制它们时,它们看起来分组在右边.我可以告诉你我的情节,但我不知道如何上传它.基本上我将一些数据值与相应的点相关联.你能告诉我怎样才能纠正它?我的完整代码是 #include <iostream>#include <cmath>#include <fstream>#include <sstream>#include <string>#include < 我使用以下代码在域中生成随机数.当我绘制它们时,它们看起来分组在右边.我可以告诉你我的情节,但我不知道如何上传它.基本上我将一些数据值与相应的点相关联.你能告诉我怎样才能纠正它?我的完整代码是
赞
(0)
打赏
微信扫一扫
支付宝扫一扫
为什么这个C指针代码不起作用?
上一篇
2022-06-05
C:如何阻止map的operator []插入虚假值?
下一篇
2022-06-05
评论列表(0条)