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 <n>' uses <n> as seed and sets rndseed to <n>
This commit is contained in:
h_vogt 2016-08-05 16:07:01 +02:00 committed by rlar
parent 187a1ab2a5
commit 4e04f1f17c
3 changed files with 44 additions and 0 deletions

View File

@ -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,

View File

@ -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);

View File

@ -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 <n>"
* seed with number <n>
*/
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);
}