# Random assignment operators

PlanOut comes built in with several built-in random assignment operators that
map units to randomized values. All operators require
one to specify an input `unit`

, and optionally allow one to specify a salt.
For more details on how randomization works, see the how PlanOut works page.

### UniformChoice

`UniformChoice`

takes an argument `choices`

and selects among these choices with uniform probability.

```
params.x = UniformChoice(choices=['a', 'b'], unit=userid)
params.y = UniformChoice(choices=['a', 'b', 'c'], unit=userid)
```

In the code above, `x`

will take on the values ‘a’ and ‘b’ a 1/2 probability each, and `y`

will take on the values ‘a’, ‘b’, and ‘c’ with a 1/3 probability each.

### WeightedChoice

`WeightedChoice`

selects among multiple choices (`choices`

) with a given set of weights (`weights`

).

```
params.x = WeightedChoice(choices=['a', 'b', 'c'], weights=[0.8, 0.1, 0.1],
unit=userid)
params.y = WeightedChoice(choices=['a', 'b', 'c'], weights=[8, 1, 1],
unit=userid)
```

Both `x`

and `y`

will take on the values ‘a’, ‘b’, and ‘c’ with a 80%, 10%, and
10% chance each. Because `x`

and `y`

have different salts, they will not
necessarily always have the same values for a given `userid`

.

### BernoulliTrial

`WeightedChoice`

flips a coin that lands on `1`

with probability `p`

, and `0`

with probability 1-`p`

.

```
params.x = BernoulliTrial(p=0.0, unit=userid)
params.y = BernoulliTrial(p=0.2, unit=userid)
```

In the code above, `x`

will always be `0`

, and `y`

will be `1`

20% of the time.

### RandomFloat

`RandomFloat`

generates a random floating point number between `min`

and `max`

.

```
params.x = RandomFloat(min=0.0, max=10.0), unit=userid)
```

### RandomInteger

`RandomInteger`

generates a random integer between `min`

and `max`

, inclusive.

```
params.x = RandomFloat(min=0, max=10), unit=userid)
```

### Sample

Sample samples from a list without replacement. It has one required parameter,
`choices`

, and an optional parameter, `num_draws`

. If
`num_draws`

is not specified, then Sample will simply shuffle the input array.

```
params.x = Sample(choices=['a','b','c'])
params.y = Sample(choices=['a','b','c'], num_draws=2)
```

In the code above, `x`

will be a three element list, containing ‘a’, ‘b’, and
‘c’, exactly once, in a random order, and `y`

be a two-element subset of
`['a','b', 'c']`

.