From 4e04f1f17c16009301db0abed19370ee1f8816f1 Mon Sep 17 00:00:00 2001 From: h_vogt Date: Fri, 5 Aug 2016 16:07:01 +0200 Subject: [PATCH] command.c, add command 'setseed' randnumb.c, add function com_sseed for immediately setting the seed of the random number generator 'setseed' uses variable rndseed as seed 'setseed ' uses as seed and sets rndseed to --- src/frontend/commands.c | 9 +++++++++ src/include/ngspice/randnumb.h | 3 +++ src/maths/misc/randnumb.c | 32 ++++++++++++++++++++++++++++++++ 3 files changed, 44 insertions(+) diff --git a/src/frontend/commands.c b/src/frontend/commands.c index 40736f329..d75beb80d 100644 --- a/src/frontend/commands.c +++ b/src/frontend/commands.c @@ -83,6 +83,7 @@ #include "resource.h" #include "diff.h" #include "com_strcmp.h" +#include "ngspice/randnumb.h" #include "arg.h" @@ -193,6 +194,10 @@ struct comm spcp_coms[] = { { 040000, 0, 0, 0 }, E_DEFHMASK, 0, 1, NULL, "[vecname] : Change default scale of current working plot." } , + { "setseed", com_sseed, FALSE, FALSE, + { 04, 0, 0, 0 }, E_DEFHMASK, 0, 1, + NULL, + "[seed value] : Reset the random number generator with new seed value." } , { "transpose", com_transpose, FALSE, FALSE, { 040000, 040000, 040000, 040000 }, E_DEFHMASK, 1, LOTS, NULL, @@ -666,6 +671,10 @@ struct comm nutcp_coms[] = { { 040000, 0, 0, 0 }, E_DEFHMASK, 0, 1, NULL, "[vecname] : Change default scale of current working plot." } , + { "setseed", com_sseed, FALSE, FALSE, + { 04, 0, 0, 0 }, E_DEFHMASK, 0, 1, + NULL, + "[seed value] : Reset therandom number generator with new seed value." } , { "transpose", com_transpose, FALSE, FALSE, { 040000, 040000, 040000, 040000 }, E_DEFHMASK, 1, LOTS, NULL, diff --git a/src/include/ngspice/randnumb.h b/src/include/ngspice/randnumb.h index f89e12707..4fc7b6a6c 100644 --- a/src/include/ngspice/randnumb.h +++ b/src/include/ngspice/randnumb.h @@ -1,6 +1,9 @@ #ifndef ngspice_RANDNUMB_H #define ngspice_RANDNUMB_H +#include "ngspice/wordlist.h" +extern void com_sseed(wordlist *wl); + /* initialize random number generators */ extern void initw(void); diff --git a/src/maths/misc/randnumb.c b/src/maths/misc/randnumb.c index c32c93161..ea461f9fe 100644 --- a/src/maths/misc/randnumb.c +++ b/src/maths/misc/randnumb.c @@ -292,3 +292,35 @@ double exprand(double mean) expval = -log(CombLCGTaus()) * mean; return expval; } + + +/* seed random number generators immediately +* command "setseed" +* take value of variable rndseed as seed +* command "setcirc " +* seed with number +*/ +void +com_sseed(wordlist *wl) +{ + int newseed; + + if (wl == NULL) { + if (!cp_getvar("rndseed", CP_NUM, &newseed)) { + newseed = getpid(); + cp_vset("rndseed", CP_NUM, &newseed); + } + srand((unsigned int)newseed); + TausSeed(); + } + else + if ((sscanf(wl->wl_word, " %d ", &newseed) != 1) || (newseed <= 0) || (newseed > INT_MAX)) { + fprintf(cp_err, "Warning: Cannot use %s as seed!\n\n", wl->wl_word); + return; + } + else { + srand((unsigned int)newseed); + TausSeed(); + } + printf("\nSeed value for random number generator is set to %d\n", newseed); +}