# The code work in windows system but does not work in linux

1. Mar 19, 2012

### nenyan

It looks like dead loop when it is running on linux system.
It works perfectly in windows.

Code (Text):

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define NF 10  //total number of data.

/* function prototypes */

double gaussian( void );

int
main()
{
int i;
double *ave;

srand(2050);
if(! (ave = malloc( NF * sizeof(double))) )
printf("memory error \n");

for(i=0;i<NF;i++)
ave[i]=gaussian();
for(i=0;i<NF;i++)
printf("%e, ", ave[i]);

free(ave);

}

double
gaussian( void )
{
static int useold = 0;
static double old;
if ( useold ) {
useold = 0;
return old;
} else {
double x, y, r2, norm;
int j;
double RAND;
do {
j=rand();
RAND=j*1.0/32767;
x = 2.0*RAND - 1.0;
j=rand();
RAND=j*1.0/32767;
y = 2.0*RAND - 1.0;
r2 = x*x + y*y;
} while ( r2 >= 1.0 || r2 == 0.0 );
norm = sqrt( -2.0*log( r2 )/r2 );
old = x*norm;
useold = 1;
return y*norm;
}
}

2. Mar 19, 2012

### D H

Staff Emeritus
The problem is the way you are using rand(). You are assuming it returns a number between 0 and 32767. Most Linux implementations of rand() return a number between 0 and 2147483647.

Two solutions:

#1: You should be dividing by RAND_MAX instead of 32767. On a Linux box, that division by 32767 means your function guassian() will be looping for a long, long, long time.

#2: Even better, don't not use rand(). It is at best a lousy pseudo random number generator, and in some implementations (e.g., microsoft) it is a very bad pseudo random number generator.

3. Mar 19, 2012

### nenyan

Thank you very much. I chose the first solution. It's the most easy way~