c++ - 无偏随机数发生器

标签 c++ random

我使用以下代码在域中生成随机数。当我绘制它们时,它们看起来在右侧分组。我可以给你看我的情节,但我不知道如何上传。基本上我将一些数据值关联到相应的点。你能告诉我如何更正吗?我的完整代码是

#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;
}

最佳答案

int r = rand() % N;

不会导致均匀分布1

相反,我建议只使用 C++ TR1(或 boost)随机:

#include <random>

std::mt19937 rng(seed);
std::uniform_int_distribution<int> gen(0, N); // uniform, unbiased

int r = gen(rng);

或者生成任何类型的 float :

std::uniform_real_distribution<double> gen(-2*PI, +2*PI); // uniform, unbiased
double r = gen(rng);

<子> 1 背景,例如:Using rand()

如果您真的坚持使用 rand() 和 N 不均分 MAX_RAND,该页面有一些提示关于如何使用其他公式实现稍微更好的整数分布。请注意,我会引导您前往 André Caron's answer反而。

关于c++ - 无偏随机数发生器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8157340/

相关文章:

c++ - C++ 编译器如何找到外部变量?

c++ - 在没有 'thread management' 的 C++ 中并发哈希表/哈希集?

python - 随机选择子目录中的 x 个文件

javascript - 使用 jQuery 在随机位置附加内容?

c++ - 我的函数的顺序重要吗?

c++ - 简单的 C++ 指针转换

c++ - "is-implemented-in-terms-of"是什么关系,我应该什么时候使用它?

javascript - 无需在 JavaScript 中选择两次的随机数组选择

algorithm - 你从这个 splinter 的随机洗牌中得到什么分布?

c - 随 secret 码生成器相同的字符串