Random Number Generators
========================

While there are many ways to generate random numbers on GPUs, SlangPy provides a couple of utilities to help you get started.

.. _generators_wanghash:

Wang Hash
---------

The Wang hash generator returns a 1D, 2D, or 3D integer hash value based on the current dispatch thread ID. As with the ID generator examples, we start with a simple Slang function that takes and returns an ``int2``:

.. code-block::

    int2 myfunc(int2 value) {
        return value;
    }

We can invoke this function and pass it the Wang hash generator as follows:

.. code-block:: python

    # Populate a 4x4 numpy array of int2s with random integer hashes
    res = np.zeros((4, 4, 2), dtype=np.int32)
    module.myfunc(spy.wang_hash(), _result=res)

    # Example output:
    # [-1062647446,-1219659480], [663891101,1738326990] ...
    print(res)

Each entry in the numpy array is now populated with a random integer hash. The ``wang_hash`` generator also supports an optional seed value.

As with the ID generator examples, we explicitly create the numpy array ``res``. This is necessary because the Wang hash generator does not define any inherent shape. Without a predefined 4x4 container, SlangPy would have no way to infer the intended dispatch size.

.. _generators_randfloat:

Random Float
------------

The random float generator builds on top of Wang hash to generate a random float within a given range. The following Slang function takes and returns a ``float2``:

.. code-block::

    float2 myfuncfloat(float2 value) {
        return value;
    }

We can invoke this function and pass it the random float generator as follows:

.. code-block:: python

    # Populate a 4x4 numpy array of float2s with random values
    res = np.zeros((4, 4, 2), dtype=np.float32)
    module.myfuncfloat(spy.rand_float(min=0, max=10), _result=res)

    # Example output:
    # [3.0781631,3.6783838], [3.2699034, 4.611035] ...
    print(res)

Just like the ``wang_hash`` generator, ``rand_float`` supports an optional seed value and does not define any inherent shape.

