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

Join the discussion
Registration is free. Ask a follow-up in this thread, or start your own.
2 replies · 3K views
nenyan
Messages
67
Reaction score
0
It looks like dead loop when it is running on linux system.
It works perfectly in windows.

Code:
#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;
  }
}
 
Physics news on Phys.org
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.
 
Thank you very much. I chose the first solution. It's the most easy way~

D H said:
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.