Rationalize random number seeding in C and Fortran

git-svn-id: svn+ssh://svn.code.sf.net/p/wsjt/wsjt/branches/wsjtx@6272 ab8295b8-cf94-4d9e-aec4-7959e3be5d79
This commit is contained in:
Bill Somerville 2015-12-14 19:40:44 +00:00
parent cc6ed82f9a
commit 6be4f3d376
10 changed files with 34 additions and 26 deletions

View File

@ -336,6 +336,7 @@ set (wsjt_FSRCS
lib/hspec.f90 lib/hspec.f90
lib/image.f90 lib/image.f90
lib/indexx.f90 lib/indexx.f90
lib/init_random_seed.f90
lib/interleave4.f90 lib/interleave4.f90
lib/interleave63.f90 lib/interleave63.f90
lib/interleave9.f90 lib/interleave9.f90
@ -417,6 +418,7 @@ set (wsjt_CSRCS
lib/ftrsd/ftrsd2.c lib/ftrsd/ftrsd2.c
lib/gran.c lib/gran.c
lib/igray.c lib/igray.c
lib/init_random_seed.c
lib/wsprd/nhash.c lib/wsprd/nhash.c
lib/tab.c lib/tab.c
lib/tmoonsub.c lib/tmoonsub.c
@ -446,6 +448,7 @@ set (wsprd_CSRCS
lib/wsprd/fano.c lib/wsprd/fano.c
lib/wsprd/tab.c lib/wsprd/tab.c
lib/wsprd/nhash.c lib/wsprd/nhash.c
lib/init_random_seed.c
) )
set (wsjtx_UISRCS set (wsjtx_UISRCS

View File

@ -17,6 +17,8 @@ program code426
call getarg(2,arg) call getarg(2,arg)
read(arg,*) iters read(arg,*) iters
call init_random_seed()
open(13,file='code426.out',status='unknown') open(13,file='code426.out',status='unknown')
write(*,1002) nmsgs,iters write(*,1002) nmsgs,iters

View File

@ -45,6 +45,8 @@ program jt4sim
freq=f0 !Silence compiler warning freq=f0 !Silence compiler warning
dphi=0.0 !Silence compiler warning dphi=0.0 !Silence compiler warning
call init_random_seed()
h=default_header(12000,npts) h=default_header(12000,npts)
if(message(1:3).eq.'sin') read(message(4:),*) sinfreq if(message(1:3).eq.'sin') read(message(4:),*) sinfreq

View File

@ -35,6 +35,8 @@ program jt65sim
go to 999 go to 999
endif endif
call init_random_seed(1)
csubmode='A' csubmode='A'
call getarg(1,csubmode) call getarg(1,csubmode)
mode65=1 mode65=1
@ -62,9 +64,6 @@ program jt65sim
h=default_header(12000,npts) h=default_header(12000,npts)
dfsig=2000.0/nsigs !Freq spacing between sigs in file (Hz) dfsig=2000.0/nsigs !Freq spacing between sigs in file (Hz)
! generate new random number seed for each run using /dev/urandom on linux and os x
! nerr=sgran()
do ifile=1,nfiles !Loop over requested number of files do ifile=1,nfiles !Loop over requested number of files
write(fname,1002) ifile !Output filename write(fname,1002) ifile !Output filename
1002 format('000000_',i4.4) 1002 format('000000_',i4.4)

View File

@ -17,6 +17,7 @@ Information-carrying channel symbols
#include <time.h> #include <time.h>
#include <string.h> #include <string.h>
#include "rs.h" #include "rs.h"
#include "init_random_seed.h"
static void *rs; static void *rs;
@ -35,6 +36,8 @@ int main(){
int mrsym[63],mrprob[63],mr2sym[63],mr2prob[63]; int mrsym[63],mrprob[63],mr2sym[63],mr2prob[63];
int nsec2,ncount,dat4[12]; int nsec2,ncount,dat4[12];
init_random_seed();
datfile=fopen("kvasd.dat","rb"); datfile=fopen("kvasd.dat","rb");
if( !datfile ) { if( !datfile ) {
printf("Unable to open kvasd.dat\n"); printf("Unable to open kvasd.dat\n");
@ -96,11 +99,11 @@ int main(){
printf("num_errors = %d\n",num_errors); printf("num_errors = %d\n",num_errors);
for( i=0; i<num_errors; i++) { for( i=0; i<num_errors; i++) {
do { do {
errval = random() & nn; errval = rand() & nn;
} while(errval == 0); //generate random } while(errval == 0); //generate random
do { do {
errloc = random() % nn; errloc = rand() % nn;
} while(errlocs[errloc]!=0); } while(errlocs[errloc]!=0);
errlocs[errloc] = errval; errlocs[errloc] = errval;

View File

@ -20,6 +20,7 @@
#include <time.h> #include <time.h>
#include <string.h> #include <string.h>
#include "rs.h" #include "rs.h"
#include "init_random_seed.h"
static void *rs; static void *rs;
@ -175,12 +176,9 @@ int main(int argc, char *argv[]){
// "soft" distance between each codeword and the received word is // "soft" distance between each codeword and the received word is
// used to decide which codeword is "best". // used to decide which codeword is "best".
// //
// srandom(time(NULL));
#ifdef WIN32 init_random_seed();
srand(0xdeadbeef);
#else
srandom(0xdeadbeef);
#endif
float p_erase; float p_erase;
int thresh, nsum; int thresh, nsum;
ncandidates=0; ncandidates=0;
@ -207,11 +205,7 @@ int main(int argc, char *argv[]){
} }
thresh = p_erase*100; thresh = p_erase*100;
long int ir; long int ir;
#ifdef WIN32
ir=rand(); ir=rand();
#else
ir=random();
#endif
if( ((ir % 100) < thresh ) && numera < 51 ) { if( ((ir % 100) < thresh ) && numera < 51 ) {
era_pos[numera]=indexes[62-i]; era_pos[numera]=indexes[62-i];
numera=numera+1; numera=numera+1;

View File

@ -1,15 +1,8 @@
#include <stdio.h> #include "init_random_seed.h"
#include <stdlib.h>
#include <unistd.h>
/* seed rand using urandom */ /* seed rand */
float sgran_() float sgran_()
{ {
unsigned int seed; init_random_seed();
FILE *urandom;
urandom = fopen ("/dev/urandom","r");
fread (&seed, sizeof (seed), 1, urandom);
srand (seed);
return(0); return(0);
} }

View File

@ -23,6 +23,7 @@ program t1
call getarg(3,arg) call getarg(3,arg)
read(arg,*) iters read(arg,*) iters
call init_random_seed()
call random_number(r) call random_number(r)
itone=0 itone=0
where(r.gt.0.5) itone=1 where(r.gt.0.5) itone=1

View File

@ -0,0 +1,8 @@
program test_init_random_seed
real :: r(10,4)
call init_random_seed()
call random_number(r)
do i =1,10
write (*, *) (r(i,j),j=1,4)
end do
end program test_init_random_seed

View File

@ -40,6 +40,7 @@
#include "nhash.h" #include "nhash.h"
#include "wsprd_utils.h" #include "wsprd_utils.h"
#include "wsprsim_utils.h" #include "wsprsim_utils.h"
#include "lib/init_random_seed.h"
#define max(x,y) ((x) > (y) ? (x) : (y)) #define max(x,y) ((x) > (y) ? (x) : (y))
// Possible PATIENCE options: FFTW_ESTIMATE, FFTW_ESTIMATE_PATIENT, // Possible PATIENCE options: FFTW_ESTIMATE, FFTW_ESTIMATE_PATIENT,
@ -614,7 +615,9 @@ int main(int argc, char *argv[])
memset(allcalls,0,sizeof(char)*100*13); memset(allcalls,0,sizeof(char)*100*13);
int uniques=0, noprint=0; int uniques=0, noprint=0;
init_random_seed();
// Parameters used for performance-tuning: // Parameters used for performance-tuning:
maxcycles=10000; //Fano timeout limit maxcycles=10000; //Fano timeout limit
double minsync1=0.10; //First sync limit double minsync1=0.10; //First sync limit