只是为了预先警告人们,我是一名物理学家,从专业程序员的角度来编写一个可能是玩具代码的模拟,所以我的编码知识并不是很好。无论如何,释义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
给出了不同的结果,即使我给它一个常量种子,如果我多次运行代码而不改变任何东西,它会给出相同的序列。如果我遗漏了重要的东西,我会提前道歉。
答案 0 :(得分:0)
我猜rnd是在MersenneTwister.h中声明的,如果是这样的函数randNorm(const double mean,const double stddev)(来自这里http://www-personal.umich.edu/~wagnerr/MersenneTwister.h)使用函数rand()。 每次你应该共同使用rand和srand来获得不同的值。看这里:http://www.cplusplus.com/reference/clibrary/cstdlib/rand/。