Math-Random-PCG32
view release on metacpan or search on metacpan
lib/Math/Random/PCG32.xs view on Meta::CPAN
if (max == min) RETVAL = min;
else if (min > max) croak("max must be greater than min");
else RETVAL = min + pcg32_random_r(rng) % (max - min + 1);
OUTPUT:
RETVAL
void
irand_way(pcg32_random_t *rng, int32_t x1, int32_t y1, int32_t x2, int32_t y2)
PREINIT:
int32_t dx, dy, magx;
PPCODE:
if (x1 == x2 && y1 == y2) XSRETURN_UNDEF;
EXTEND(SP, 2);
dx = x2 - x1;
dy = y2 - y1;
if (dx == 0) goto MOVE_Y;
else if (dy == 0) goto MOVE_X;
magx = abs(dx);
if (pcg32_random_r(rng) % (magx + abs(dy)) < magx) {
MOVE_X:
mPUSHs(newSViv(x1 + (dx > 0 ? 1 : -1)));
lib/Math/Random/PCG32.xs view on Meta::CPAN
OUTPUT:
RETVAL
void
sample(pcg32_random_t *rng, uint32_t count, avref)
AV *avref;
PREINIT:
AV* smpl;
SSize_t len, i;
uint32_t total;
PPCODE:
smpl = newAV();
len = av_len(avref) + 1;
if (len == 0 || count == 0) goto DONE;
if (count >= len) {
av_extend(smpl, len - 1);
for (i = 0; i < len; i++) {
SV *sv = *av_fetch(avref, i, FALSE);
av_push(smpl, sv);
}
} else {
lib/Math/Random/PCG32.xs view on Meta::CPAN
}
total--;
}
}
DONE:
ST(0) = sv_2mortal( newRV_inc((SV *) smpl) );
XSRETURN(1);
void
DESTROY(pcg32_random_t *rng)
PPCODE:
Safefree(rng);
( run in 0.864 second using v1.01-cache-2.11-cpan-5511b514fd6 )