[un/loquer] amañar números aleatorios (weighted distribution)

Federico Lopez jardincosmico en gmail.com
Lun Abr 7 01:46:26 UTC 2014


Hace poco quería producir música semi-aleatoria, que al llamar una función
me retornara una escala (array) y seleccionar aleatoriamente de esa escala,
pero resulta que en música hay notas de la escala que tienden a repetirse
más que otras .. entonces un resultado totalmente aleatorio no servía.

Rafa me dio una solución que es repetir, en la escala, varias veces las
notas que mas quiero repetir, así hay más posibilidades de que caigan en
los valores más comunes.

vamos a tener más probabilidades que salgan 1 y 5 en
un array :
[1,1,1,1,2,3,4,5,5,5,5]
que en original donde todas las notas tengan el mismo peso:
[1,2,3,4,5]

Hoy aprendí dos técnicas más: si quiero que el resultado de la
"aleatoriedad" tenga más  probabilidades en los números  mas pequeños
hacemos dos variables y ponemos un condicional que nos regrese el menor de
los dos números, el resultado quedará pesado para abajo:

repeat(20)
{
Std.rand2 ( 0 , 100 ) => int  a ;
Std.rand2 ( 0 , 100 ) => int  b ;
if ( a < b ) <<< a >>>;
else <<< b >>>;
}

también se puede hacer pesado para arriba

Ahora si queremos una forma triangular .. mas pesado en los números medios:

repeat (20)
{
Std.rand2 ( 0 , 100 ) => int  a;
Std.rand2 ( 0 , 100 ) => int  b;
<<< ( a+b ) / 2 >>>;
}

por ahora solo sé esas cuatro maneras .. pero estoy coleccionando .. si
encuentran otras estaría muy feliz de aprenderlas.

fede-
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.aktivix.org/pipermail/unloquer/attachments/20140406/b06fc139/attachment.html>


Más información sobre la lista de distribución unloquer