私は物理学者であり、おそらくプロのプログラマーの視点からのおもちゃコードであるシミュレーションを書いているので、コーディングの知識はそれほど大きくありません。とにかく、700行を言い換え、私のコードは次のようになります。1つの関数内のローカル変数が無関係な関数に変化するC++
#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
は、たとえ定数のシードを与えても、別の結果を返します。何も変更せずにコードを複数回実行すると、同じシーケンスが得られます。私は重要なことを残しておけば、事前にお詫びします。
コードを 'valgrind'または同様のツールの下で実行します。その範囲外の配列やその他のオブジェクトにアクセスしている可能性があります。 –
InitializeStuffAboveはDistとNear Rateを初期化しますか? – EvilTeach
「私はシミュレーションを書いている物理学者です...」というフレーズは、私にかなりのフラッシュバックを与えました。 (そしてあなたのユーザー名はあなたの驚くべき量を明らかにしますが、心配しません。)とにかく、エラーを再現するために十分に投稿していないと、私たちが助けてくれるのは難しいです。私のアドバイス:*簡素化*。できるだけ多くのコードを削除し、あらゆるステップで奇妙な動作が続くことを確認してください。 'Calcounds'と' Particle.h'を取り除き、 'GaussianDisorder'を' rnd'へのいくつかの呼び出しに減らします。ある時点で、原因があなたに飛び出すか、全体を投稿するのに十分な小さなものに到着します。 – Beta