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 )