Files @ a58b80c85b6f
Branch filter:

Location: EI/VirtualLeaf/src/random.cpp

Michael Guravage
Cleanup: e.g. removed commented out and otherwise disabled code.
--
user: Michael Guravage <michael.guravage@cwi.nl>
branch 'default'

changed src/OptionFileDialog.cpp
changed src/OptionFileDialog.h
changed src/UniqueMessage.cpp
changed src/VirtualLeaf.cpp
changed src/apoplastitem.cpp
changed src/apoplastitem.h
changed src/build_models/auxingrowthplugin.cpp
changed src/build_models/meinhardtplugin.cpp
changed src/build_models/testplugin.h
changed src/canvas.cpp
changed src/canvas.h
changed src/cell.cpp
changed src/cell.h
changed src/cellbase.cpp
changed src/cellbase.h
changed src/data_plot.cpp
changed src/data_plot.h
changed src/flux_function.h
changed src/forwardeuler.cpp
changed src/infobar.h
changed src/mainbase.cpp
changed src/mainbase.h
changed src/matrix.cpp
changed src/mesh.h
changed src/modelcatalogue.cpp
changed src/node.cpp
changed src/node.h
changed src/nodeitem.cpp
changed src/nodeset.h
changed src/output.cpp
changed src/output.h
changed src/parse.cpp
changed src/parse.h
changed src/random.cpp
changed src/random.h
changed src/sqr.h
changed src/vector.h
changed src/vleafmodel.h
changed src/wall.cpp
changed src/wallbase.cpp
changed src/wallbase.h
changed src/wallitem.cpp
changed src/wallitem.h
changed src/warning.cpp
changed src/warning.h
changed src/xmlwrite.cpp
/*
 *
 *  This file is part of the Virtual Leaf.
 *
 *  The Virtual Leaf is free software: you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation, either version 3 of the License, or
 *  (at your option) any later version.
 *
 *  The Virtual Leaf is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with the Virtual Leaf.  If not, see <http://www.gnu.org/licenses/>.
 *
 *  Copyright 2010 Roeland Merks.
 *
 */

#include <QDebug>
#include <string>
#include <stdio.h>
#include <stdlib.h>
#include <sys/timeb.h>
#include <iostream>
#include "random.h"

static const std::string _module_id("$Id$");

static int idum = -1;
using namespace std;

static int counter=0;
/*! \return A random double between 0 and 1
**/
double RANDOM(void)
/* Knuth's substrative method, see Numerical Recipes */
{
  static int inext,inextp;
  static long ma[56];
  static int iff=0;
  counter++;
  long mj,mk;
  int i,ii,k;
  
  if (idum < 0 || iff == 0) {
    iff=1;
    mj=MSEED-(idum < 0 ? -idum : idum);
    mj %= MBIG;
    ma[55]=mj;
    mk=1;
    i=1;
    do {
      ii=(21*i) % 55;
      ma[ii]=mk;
      mk=mj-mk;
      if (mk < MZ) mk += MBIG;
      mj=ma[ii];
    } while ( ++i <= 54 );
    k=1;
    do {
      i=1;
      do {
        ma[i] -= ma[1+(i+30) % 55];
        if (ma[i] < MZ) ma[i] += MBIG;
      } while ( ++i <= 55 );
    } while ( ++k <= 4 );
    inext=0;
    inextp=31;
    idum=1;
  }
  if (++inext == 56) inext=1;
  if (++inextp == 56) inextp=1;
  mj=ma[inext]-ma[inextp];
  if (mj < MZ) mj += MBIG;
  ma[inext]=mj;
  return mj*FAC;
}

/*! \param An integer random seed
  \return the random seed
**/
int Seed(int seed)
{
  if (seed < 0) {
    int rseed=Randomize();
    #ifdef QDEBUG
    qDebug() << "Randomizing random generator, seed is " << rseed << endl;
    #endif
    return rseed;
  } else {
    int i;
    idum = -seed;
    for (i=0; i <100; i++)
      RANDOM();
    return seed;
  }
}


/*! Returns a random integer value between 1 and 'max'
  \param The maximum value (long)
  \return A random integer (long)
**/
long RandomNumber(long max)
{
   return((long)(RANDOM()*max+1));
}

/*! Interactively ask for the seed
\param void
\return void
**/
void AskSeed(void)
{
  int seed;
  printf("Please enter a random seed: ");
  scanf("%d",&seed);
  printf("\n");
  Seed(seed);
}

int RandomCounter(void) {
  return counter;
}

/*! Make a random seed based on the local time
\param void
\return void
**/

int Randomize(void) {
  
  // Set the seed according to the local time
  struct timeb t;
  int seed;

  ftime(&t);
  
  seed=abs((int)((t.time*t.millitm)%655337));
  Seed(seed);
#ifdef QDEBUG
  qdebug() << "Random seed is " << seed << endl;
#endif
  return seed;
}