# Pseudo-Random Number Generation (PRNG)

-   Most MOOSE objects include an interface for generating pseudo-random numbers consistently during serial, parallel, and threaded r
-   This consistency enables more robust development and debugging without sacrificing PRNG quality.
-   Users have control over the reset frequency of the PRNG.
-   Helps avoid convergence issues due to excessive PRNG noise during linear or non-linear iterations.
-   The PRNG system avoids the repetition of "patterns" in subsequent executions of an application.

[](---)
# Using Random Numbers

-   Make a call to `setRandomResetFrequency()` in your object's constructor.

```cpp
        // Options include EXEC_RESIDUAL, EXEC_JACOBIAN, EXEC_TIMESTEP, EXEC_INITIAL
        // Note: EXEC_TIMESTEP == EXEC_TIMESTEP_BEGIN for the purpose of reset

        setRandomResetFrequency(EXEC_RESIDUAL);
```

-   Obtain Random Numbers (Real or Long)

```cpp
        // anywhere inside your object (except the constructor)

        unsigned long random_long = getRandomLong();
        Real random_real = getRandomReal();
```

[](---)
# More Details

-   Each `MooseObject` has its own "seed" value.
-   The seed is used to generate different random sequences from run to run.
-   The "reset frequency" specifies how often the random number generators should be reset.
-   If you reset on `EXEC_RESIDUAL`, you will get the same random number sequence each residual evaluation for a given timestep.
-   You can also reset less often, e.g. Jacobian, timestep, or simulation initialization only.
-   Generators are advanced every time step unless you explicitly set the reset frequency to `EXEC_INITIAL`.
-   A multi-level random seeding scheme is used to avoid patterning from mesh entity to mesh entity, timestep to timestep, and run to run