Pseudo-random generation functions
====================================
**Contract / Module:**
* free.util-random
**Dependencies:**
* free.util-lists
* free.util-strings
* free.util-math
* free.util-chain-data
This module provides random generation functions.
The random integers Xn are generated according to the following formula:
- Xn = HASH(Xn-1 + TxHash + HASH(block-time))
- Xn is stored in database for the next iteration
The random strings is derived from Xn with the following formula:
S = HASH( [Xn + 1] ) + HASH ( [Xn + 2] ) + HASH ( [Xn + 3] ) + ..........
The result is easy to predict. Even if block-time includes microseconds, block-time is an exact copy of the creation-time of the previous block.
That's why a contract whose security would rely on that module would be highly exploitable.
An attacker just need to watch the current block, to predict what will be the generated numbers in the next block.
**DO NOT NOT NOT USE this PRBS generator for cryptographic or lottery purposes**.
Several numbers can be generated in the same block or transaction. They will be all different, and uncorrelated.
Integers
---------
random-int
~~~~~~~~~~
**↦** ``integer``
Returns a 256 bit random integer
.. code:: lisp
pact> (random-int)
42217767265191416845873285650063916717654783831511640486359396574333357048814
pact> (random-int)
111356071076120320443192908521083690658058559363319245130075594187850043340684
random-int-range
~~~~~~~~~~~~~~~~
*_min* ``integer`` *_max* ``integer`` **↦** ``integer``
Returns a random integer in range [min - max].
.. code:: lisp
pact> (random-int-range 0 10)
6
pact> (random-int-range 0 10)
7
pact> (random-int-range 0 10)
0
Booleans
--------
random-bool
~~~~~~~~~~~
**↦** ``bool``
Returns a random boolean
.. code:: lisp
pact> (random-bool)
true
pact> (random-bool)
true
pact> (random-bool)
false
Decimals
---------
random-decimal-range
~~~~~~~~~~~~~~~~~~~~
*_min* ``decimal`` *_max* ``decimal`` **↦** ``decimal``
Returns a random decimal in range [min - max].
.. code:: lisp
pact> (random-decimal-range -1.0 1.0)
0.636958912683
pact> (random-decimal-range -1.0 1.0)
0.857566630911
pact> (random-decimal-range -1.0 1.0)
0.376521587006
Lists
------
random-choice
~~~~~~~~~~~~~~~~
*choices-list* ``[]`` **↦** ````
Returns a random element from the non-empty list.
.. code:: lisp
pact> (random-choice ["Cat", "Dog", "Horse", "Rabbit"])
"Rabbit"
pact> (random-choice ["Cat", "Dog", "Horse", "Rabbit"])
"Cat"
pact> (random-choice ["Cat", "Dog", "Horse", "Rabbit"])
"Cat"
pact> (random-choice ["Cat", "Dog", "Horse", "Rabbit"])
"Dog"
shuffle
~~~~~~~
*in* ``[]`` **↦** ``[]``
Shuffles a list using a sort method with random indexes.
.. code:: lisp
pact> (+ "My preference pets order list is:" (to-string (shuffle ["Cat", "Dog", "Horse", "Rabbit", "Snake", "Ferret", "Rat", "Goldfish"])))
"My preference pets order list is:["Dog" "Horse" "Rat" "Snake" "Ferret" "Rabbit" "Cat" "Goldfish"]"
pact> (+ "My preference pets order list is:" (to-string (shuffle ["Cat", "Dog", "Horse", "Rabbit", "Snake", "Ferret", "Rat", "Goldfish"])))
"My preference pets order list is:["Rat" "Snake" "Dog" "Cat" "Horse" "Ferret" "Rabbit" "Goldfish"]"
pact> (+ "My preference pets order list is:" (to-string (shuffle ["Cat", "Dog", "Horse", "Rabbit", "Snake", "Ferret", "Rat", "Goldfish"])))
"My preference pets order list is:["Ferret" "Goldfish" "Horse" "Cat" "Rat" "Dog" "Snake" "Rabbit"]"
pact> (+ "My preference pets order list is:" (to-string (shuffle ["Cat", "Dog", "Horse", "Rabbit", "Snake", "Ferret", "Rat", "Goldfish"])))
"My preference pets order list is:["Cat" "Rat" "Goldfish" "Rabbit" "Ferret" "Snake" "Dog" "Horse"]"
pact> (+ "My preference pets order list is:" (to-string (shuffle ["Cat", "Dog", "Horse", "Rabbit", "Snake", "Ferret", "Rat", "Goldfish"])))
"My preference pets order list is:["Goldfish" "Rat" "Snake" "Cat" "Ferret" "Horse" "Rabbit" "Dog"]"
Strings
---------
random-string
~~~~~~~~~~~~~
*len* ``integer`` **↦** ``string``
Returns a random string of length *len*.
.. code:: lisp
pact> (random-string 5)
"5KkYZ"
pact> (random-string 129)
"uNeV0pWbdBtGA6eIOZ34iLlE62QtkPrpwXurESXfjjEbls5ViT6Hs3wISs4WMMlEUS2hGl9tAd1vjy3HREdgdwed8pgJkBbPxj5Q7eiTkvoEgnE4cwFNWqM1qvjOFmNb0"
gen-uuid-rfc-4122-v4
~~~~~~~~~~~~~~~~~~~~
**↦** ``string``
Generate an UUID (Universal Unique ID) according to RFC 4122 v4.
.. code:: lisp
pact> (gen-uuid-rfc-4122-v4)
"c69c765d-46bd-4673-973b-09f1498921b3"
pact> (gen-uuid-rfc-4122-v4)
"11cebf69-41ce-485d-85f0-644630f7b5c6"