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); +}