# Random Sampling ​

Several functions allow values or points to be sampled at random. These values are effectively fixed constants that depend only on the current variation (which determines the random seed). Unlike unknown values ?, they cannot be optimized—just as constants like 1.23 cannot be optimized. For instance, in the Style code

scalar x = random(0,100)
encourage x == 50

the encourage statement will have no effect on the value of x. Randomly-sampled constants can of course be used to define other quantities, which can in turn be optimized. For instance,

-- construct a vector v
scalar L = random(1,2) -- pick a random length between 1 and 2
scalar θ = ? -- angle is unknown
vec2 v = L * ( cos(θ),sin(θ) )

-- try to get this vector to meet the point p
encourage norm( v - p ) == 0

Here, Penrose can rotate the vector in order to make it reach p, but it cannot grow or shrink its length L (which is a random, but fixed constant value). In short, the guiding principle is that randomly-sampled values will behave like constants.

## Random Sampling Functions ​

Functions that perform random sampling generally have the suffix random. For instance:

• random( minVal, maxVal ) — samples a random constant uniformly from the range [minVal,maxVal)
• unitRandom() — samples a random constant uniformly from the range [0,1).
• normalRandom() — samples a random constant from a normal distribution with mean 0 and standard deviation 1.
• diskRandom() — samples a random point uniformly from the unit disk.
• sphereRandom() — samples a random point uniformly from the unit sphere.
• triangleRandom(a,b,c) — samples a random point uniformly from a triangle with vertices a, b, c.

Additional random sampling functions may be available—refer to the function library for further information.