Esempio n. 1
0
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_;
}
Esempio n. 2
0
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;
}
Esempio n. 3
0
	virtual void reset() { nrnran123_setseq(s_, 0, 0); }