Packages
moar
1.57.0
5.0.0
4.3.0
4.2.0
4.1.0
4.0.0
3.2.0
3.1.0
3.0.0
2.7.0
2.6.0
2.5.0
2.4.2
2.4.1
2.4.0
2.3.0
2.2.0
2.1.0
2.0.1
2.0.0
1.64.0
1.63.1
1.63.0
1.62.0
1.61.2
1.61.1
1.61.0
1.60.0
1.59.2
1.59.1
1.59.0
1.58.0
1.57.0
1.56.2
1.56.1
1.56.0
1.55.0
1.54.0
1.53.0
1.52.1
1.52.0
1.51.0
1.50.0
1.49.0
1.48.0
1.47.0
1.46.0
1.45.1
1.45.0
1.44.0
1.43.0
1.42.0
1.41.0
1.40.0
1.39.0
1.38.0
1.37.0
1.36.0
1.35.0
1.34.0
1.33.0
1.32.0
1.31.0
1.30.0
1.29.0
1.28.0
1.27.0
1.26.0
1.25.0
1.24.1
1.24.0
1.23.0
1.22.0
1.21.0
1.20.0
1.19.3
1.19.2
1.19.1
1.19.0
1.18.1
1.18.0
1.17.0
1.16.0
1.15.0
1.14.0
1.13.1
1.13.0
1.12.0
1.11.0
1.10.0
1.9.0
1.8.0
1.7.0
1.6.0
1.5.0
1.4.0
1.3.0
1.2.0
1.1.0
1.0.0
0.1.0
A dependency-free utility library containing 100+ useful functions.
Current section
Files
Jump to
Current section
Files
lib/random.ex
defmodule Moar.Random do
# @related [test](/test/random_test.exs)
@moduledoc "Generates random data."
@type encoding() :: :base32 | :base64
@doc "Return a random float greater than or equal to `min` and less than `max`"
@spec float(number(), number()) :: float()
def float(min, max) when max > min,
do: min + :rand.uniform() * (max - min)
@doc """
Randomly increases or decreases `number` by a random amount up to `percent` of `number`.
For example, `Etc.Random.fuzz(100, 0.2)` could return a number as low as 80.0 or as high as 120.0.
```elixir
iex> n = Etc.Random.fuzz(100, 0.2)
iex> n <= 120 && n >= 80
true
iex> n > 120 || n <= 80
false
```
"""
@spec fuzz(number(), number()) :: number()
def fuzz(number, percent) when is_number(number) and is_number(percent) and percent >= 0 and percent <= 1,
do: number * (1.0 - Moar.Random.float(-percent, percent))
@doc "Returns a random integer between `0` and `max`."
@spec integer(max :: pos_integer()) :: pos_integer()
def integer(max \\ 1_000_000_000),
do: 0..max |> Enum.random()
@doc """
Returns a base64- or base32-encoded random string of 32 characters.
See `Moar.Random.string/2`.
"""
@spec string(encoding :: encoding()) :: binary()
def string(:base32), do: string(32, :base32)
def string(:base64), do: string(32, :base64)
@doc """
Returns a base64- or base32-encoded random string of given length.
```elixir
iex> Moar.Random.string()
"Sr/y4m/YiVSJcIgI5lG+76vMfaZ7KZ7c"
iex> Moar.Random.string(5)
"9pJrK"
iex> Moar.Random.string(5, :base32)
"AC53Z"
```
"""
@spec string(character_count :: pos_integer(), encoding :: encoding()) :: binary()
def string(character_count \\ 32, encoding \\ :base64) when is_number(32) and encoding in [:base32, :base64] do
character_count
|> :crypto.strong_rand_bytes()
|> encode(encoding)
|> binary_part(0, character_count)
end
# # #
defp encode(bytes, :base32), do: Base.encode32(bytes, padding: false)
defp encode(bytes, :base64), do: Base.encode64(bytes, padding: false)
end