c++ - 一个函数中的局部变量更改导致不相关的函数,C++

标签 c++ mersenne-twister

预先警告大家,我是一名物理学家,正在编写一个模拟,从专业程序员的角度来看,这可能是玩具代码,所以我的编码知识并不丰富。无论如何,解释 700 行,我的代码如下所示:

#define _USE_MATH_DEFINES
#include "MersenneTwister.h"  //Random number generator
#include "Particle.h"         //Class that just keeps track of coordinates
#include <algorithm>
#include <vector>
using namespace std;

const double SomeGlobalParameters;

//Filling an array with gaussian random numbers

void GaussianDisorder(double EnergyArray[Nx][Ny][Nz], double Sigma)
{
    for (int i=0; i<Nx; i++){
        for (int j=0; j<Ny; j++){
            for (int k=0; k<Nz; k++){
                EnergyArray[i][j][k] = rnd.randNorm(0, Sigma);
            }
        }
    }
}

//Using the above array (read only) to do some calculations

void CalcRates(Particle &charge1, const double (&EnergyArray)[Nx][Ny][Nz], double (&RateArray)[12])
{
    int X1 = charge1.xPosition();
    double NearRate, MagSqr, Dist, OldDist, OldEnergy, NewEnergy;    //Declaring stuff for later
    const double Parity=1.0;

    InitializeStuffAbove(SomeGlobalParameters);           // Give stuff values based on parameters

    if (Dist == 0)
        RateArray[0] = NearRate;
    else
        NewEnergy = Parity*EnergyArray2[X1+1][Y1][Z1] - Efield[0] + Coulomb/(Dist);

int main()
{
    double EnergyArray[Nx][Ny][Nz];
    double RateArray[12];

    GaussianDisorder(EnergyArray);
    CalcRates(charge1, EnergyArray, RateArray);

    return 0;
}

我的问题是当我改变的时候

const double Parity=1.0;

,这是一个局部变量,给

const double Parity=-1.0;

我的随机数生成器在

void GaussianDisorder

给出了不同的结果,即使我给了它一个不变的种子,如果我多次运行代码而不改变任何东西,它也会给出相同的序列。如果我遗漏了一些重要的事情,我提前道歉。

最佳答案

我猜 rnd 是在 MersenneTwister.h 中声明的,如果是的话,函数 randNorm(const double mean, const double stddev)(来自这里 http://www-personal.umich.edu/~wagnerr/MersenneTwister.h)使用函数 rand()。 为了每次都有不同的值,你应该 union 使用 rand 和 srand 。看这里:http://www.cplusplus.com/reference/clibrary/cstdlib/rand/ .

关于c++ - 一个函数中的局部变量更改导致不相关的函数,C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9381863/

相关文章:

c++ - Mixin和接口(interface)实现

c++ - 使用 unique_ptr 成员编写移动构造函数的正确方法(崩溃)

random - 用于集群环境的伪随机数生成器

c++ - 如何检查多个变量是否等于相同的值?

c++ - 关闭后等待文件删除

c++ - 在 C++ 中使用指针会减少运行时间?

php - array_rand 是否使用 Mersenne Twister 算法?

python - 与 numpy 的 np.random.RandomState 和 Python 的 random.Random 相互转换?

java - 为什么允许保留 nextLong() 的底部字有符号?

python - numpy.random 和蒙特卡洛