RAND
Generate a random number or Vector of random numbers, depending on the distribution selected. Inputs
------
default : DataContainer
unused in this node Params: distribution : select the distribution over the random samples size : int the size of the output. =1 outputs Scalar, >1 outputs Vector lower_bound : float the lower bound of the output interval upper_bound : float the upper bound of the output interval normal_mean : float the mean or "center" of the normal distribution normal_standard_deviation : float the spread or "width" of the normal distribution poisson_events : float the expected number of events occurring in a fixed time-interval when distribution is poisson Returns: out : Scalar|Vector Vector if size > 1
v: the random samples
Scalar if size = 1
c: the random number
Python Code
import random
from typing import Literal, Optional
import numpy as np
from flojoy import DataContainer, Scalar, Vector, display, flojoy
@flojoy
def RAND(
default: Optional[DataContainer] = None,
distribution: Literal["normal", "uniform", "poisson"] = "normal",
size: int = 1000,
lower_bound: float = 0,
upper_bound: float = 1,
normal_mean: float = 0,
normal_standard_deviation: float = 1,
poisson_events: float = 1,
) -> Vector | Scalar:
"""Generate a random number or Vector of random numbers, depending on the distribution selected.
Inputs
------
default : DataContainer
unused in this node
Parameters
----------
distribution : select
the distribution over the random samples
size : int
the size of the output. =1 outputs Scalar, >1 outputs Vector
lower_bound : float
the lower bound of the output interval
upper_bound : float
the upper bound of the output interval
normal_mean : float
the mean or "center" of the normal distribution
normal_standard_deviation : float
the spread or "width" of the normal distribution
poisson_events : float
the expected number of events occurring in a fixed time-interval when distribution is poisson
Returns
-------
Scalar|Vector
Vector if size > 1
v: the random samples
Scalar if size = 1
c: the random number
"""
assert size >= 1, "Size must be greater than or equal to than 1"
if upper_bound < lower_bound:
upper_bound, lower_bound = lower_bound, upper_bound
seed = random.randint(1, 10000)
my_generator = np.random.default_rng(seed)
match distribution:
case "uniform":
y = my_generator.uniform(low=lower_bound, high=upper_bound, size=size)
case "normal":
y = my_generator.normal(
loc=normal_mean, scale=normal_standard_deviation, size=size
)
case "poisson":
y = my_generator.poisson(lam=poisson_events, size=size)
if size > 1:
return Vector(v=y)
return Scalar(c=float(y[0]))
@display
def OVERLOAD(size, lower_bound, upper_bound, distribution="uniform") -> None:
return None
@display
def OVERLOAD( # noqa: F811
size, normal_mean, normal_standard_deviation, distribution="normal"
) -> None:
return None
@display
def OVERLOAD(size, poisson_events, distribution="poisson") -> None: # noqa: F811
return None
Example
Having problems with this example app? Join our Discord community and we will help you out!
In this example, the RAND
node generates random values following a normal (or Gaussian) distribution.
The distribution is then plotted with HISTOGRAM
and as expected of a Gaussian distribution,
the output of the HISTOGRAM
node converges towards a bell curve.
There’s also a RAND
node with the size
parameter set to 1, in which case a single number would be generated, which is displayed by BIG_NUMBER
in this example.