Локальная переменная в одной функции, изменяющая результаты в несвязанной функции, C ++ - PullRequest
3 голосов
/ 21 февраля 2012

Просто чтобы предупредить людей, я физик, пишу симулятор, который, вероятно, является игрушечным кодом с точки зрения профессионального программиста, поэтому мои знания в области программирования невелики.В любом случае, перефразируя 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

дает другой результат, даже если я дал ему постоянное начальное число, и он дает ту же последовательность, если я запускаю код несколько раз, не меняя ничего.Я заранее прошу прощения, если я упустил что-то важное.

1 Ответ

0 голосов
/ 24 февраля 2012

Я полагаю, что rnd объявлен в MersenneTwister.h, если это так, функция randNorm (const double среднее, const double stddev) (отсюда http://www -personal.umich.edu / ~ wagnerr / MersenneTwister.h ) используя функцию rand ().Чтобы каждый раз иметь разные значения, вы должны использовать rand и srand совместно.Смотрите здесь: http://www.cplusplus.com/reference/clibrary/cstdlib/rand/.

...