# walker-sample

> Walker alias method for sampling a discrete probability distribution in O(1) time.

Latest version **0.0.1** (published 2016-11-05) · MIT license · 0 weekly downloads

## Install

```sh
npm install walker-sample
pnpm add walker-sample
yarn add walker-sample
bun add walker-sample
```

## Health

**Score 15/100 (F)** — status: abandoned.

Positive: no vulnerabilities.

Warnings: low downloads; no types; no esm support; pre 1.0.

Negative: abandoned; low maintenance score.

## Facts

| | |
|---|---|
| Version | 0.0.1 |
| Published | 2016-11-05 |
| First published | 2015-11-07 |
| Weekly downloads | 0 |
| License | MIT |
| TypeScript types | none |
| Module format | CommonJS |
| Dependencies | 0 |
| Known vulnerabilities | 0 |
| Install scripts | no |
| GitHub stars | 4 |
| Author | Matt Bierner |
| Maintainers | mattbierner |
| Keywords | walker, sample, distribution, alias method |

## Links

- npm: https://www.npmjs.com/package/walker-sample
- Repository: https://github.com/mattbierner/walker-sample
- Homepage: https://github.com/mattbierner/walker-sample#readme
- Issues: https://github.com/mattbierner/walker-sample/issues
- npm.io page: https://npm.io/package/walker-sample

## Recent versions

- 0.0.1 (latest) — 2016-11-05
- 0.0.0 — 2015-11-07

## README

# Walker-Sample

Small node.js library for sampling discrete probability distribution using the [Walker alias method](https://en.wikipedia.org/wiki/Alias_method) in O(1) time.

## Install

```sh
$ npm install walker-sample
```

## Usage
The top level export of `walker-sample` is a function that constructs a table to allow O(1) sampling:

```js
const walker = require('walker-sample');
        
// Create table with weights
const sampler = walker([
    [1, 'a'],   
    [3, 'b'],
    [2, 'c'],
    [4, 'd']]);
```

The function takes a list of weight, value pairs. The weights must be greater than zero and positive, but the weights themselves can be any integer or floating point value. Passing in a weight less than or equal to zero throws an exception.

The table above will produces `'a'` 10% of the time, `'b'` 30%, `'c'` 20%, and `'d'` 40% of the time. Weights are relative, so we get the same behavior with:

```js
const sampler = walker([
    [0.1, 'a'],   
    [0.3, 'b'],
    [0.2, 'c'],
    [0.4, 'd']]);
```

or with:

```js
const sampler = walker([
    [300, 'a'], 
    [900, 'b'],
    [600, 'c'],
    [1200, 'd']]);
```

### Sampling
`sampler` is just a function that can be sampled in O(1) time:

```
sampler() === 'd';
```

The default behavior uses `Math.random` for sampling. The sample function can also take a custom random number generator if predictable samples are needed. This is useful for testing.
    
```js
const r = () => 0.5;
sampler(r) === 'a';
sampler(r) === 'a';
...
// still 'a'
sampler(r) === 'a';
```

If you want to use the same random number generator for all samples, use `.bind`

```js
const biasedSampler = sampler.bind(null, () => 0.5);
biasedSampler() === 'a';
```

The random number generator must be a function that takes no arguments and produces a number between [0, 1]. This random number generator will be invoked twice for each sample.

---
_Source: https://npm.io/package/walker-sample · Machine-readable twin of the npm.io package page. Health data is recomputed on every publish._
