static double r_sequence(void* r) { Rand* x = (Rand*)r; if (x->type_ != 2 && x->type_ != 4) { hoc_execerror("Random.seq() can only be used if the random generator was MCellRan4 or Random123", 0); } if (x->type_ == 4) { uint32_t seq; char which; if (ifarg(1)) { double s = chkarg(1, 0., 17179869183.); /* 2^34 - 1 */ seq = (uint32_t)(s/4.); which = char(s - seq*4.); NrnRandom123* nr = (NrnRandom123*)x->gen; nrnran123_setseq(nr->s_, seq, which); } nrnran123_getseq(((NrnRandom123*)x->gen)->s_, &seq, &which); return double(seq)*4. + double(which); } MCellRan4* mcr = (MCellRan4*)x->gen; if (ifarg(1)) { mcr->ihigh_ = (long)(*getarg(1)); } return (double)mcr->ihigh_; }
nrnran123_State* nrnran123_newstream(uint32_t id1, uint32_t id2) { nrnran123_State* s = (nrnran123_State*)ecalloc(sizeof(nrnran123_State), 1); s->c.v[2] = id1; s->c.v[3] = id2; nrnran123_setseq(s, 0, 0); MUTLOCK ++instance_count_; MUTUNLOCK return s; }
virtual void reset() { nrnran123_setseq(s_, 0, 0); }