2011-08-12 10 views
6

Supongamos que selecciono pseudoaleatoriamente un número del 1 al 50 cada segundo durante 100 segundos, y con el paso del tiempo es más probable que el número elegido sea mayor. ¿Cómo podría estructurar tal algoritmo?Distribución de probabilidad de números aleatorios hacia adelante

Por ejemplo: después de 99 segundos la probabilidad de elegir un número más cercano a 50 es mucho más probable que la elección de un número más cercano a 1.

O: el número recogió después es más probable que sea mayor de 10 segundos el número recogió después de 9 segundos

Respuesta

4

Tengo una solución simple para usted. En lugar de rand(1, 50) (digamos esta función genera números aleatorios uniformemente 1..50) utiliza esta expresión:

power(rand(1, power(50, exp)), 1/exp) 

esto todavía le dará todos los números 1..50. Para exp = 1, la distribución será uniforme. A medida que aumente ligeramente la exp (por ejemplo, como 1.1 o más), aumentará la probabilidad de obtener números más grandes. Cuanto mayor sea la exp, más se incrementará a 50.

lo que puede hacer por ejemplo:

factor = 1 /* finetune this for your needs */ 
for second = 0..100 
    exp = 1 + (second/100) * factor 
    rand_num = power(rand(1, power(50, exp)), 1/exp) 
endfor 
1

Pseudocódigo:

let i = 0 
let n = 50 // Adjust for your needs 
for i goes to 100 { 
    randomnum = int(sqrt(rand(1, 50*n))); 
} 

Esto puede ser muy inclinado hacia delante, pero es una manera de acercarse a ella.

Gracias a Ricky Bobby por señalar un problema fundamental con mi antiguo enfoque. Esto está inspirado por la sugerencia de yi_H de usar una función como sqrt.

+0

no asegurarse de que funciona para cualquier rand function.if rand es uniforme en cada paso de la probabilidad sigue siendo uniforme (la probabilidad de elegir 1 es la misma que 51, que es igual a 50, incluso si se elimina el número por encima de 50). ¿O estoy perdiendo algo? –

+0

Gracias, revisé mi respuesta. –

+0

Creo que la función cóncava debe evolucionar con i, de lo contrario la distribución de probabilidad es la misma en todo momento. Puedes usar randomnum int (50 * pow (rand(), 1/i)) –

0

Probablemente haya formas más simples para lo que está haciendo, pero la solución general es usar inverse transform sampling.

En esencia, si se quiere producir un número aleatorio con un determinado formato PDF, p (x), que calcular primero la función inversa acumulativa densidad (CDF), P '(x). A continuación, puede generar números aleatorios uniformes entre 0 y 1, y luego aplicar P '(x) a ellos.

5

Elija cualquier función cóncava monótona como la raíz cuadrada que mapea de 0 a 0 y 1 a 1. Genere un número aleatorio entre [0,1], aplique la función y luego scretch [0,1] al intervalo deseado ([ 1,50]).

Ahora, si cambia la transformación lineal f (x) = x a la función de transformación mencionada, por ejemplo, una ponderación simple tiene el efecto deseado.

+0

+1, este es un enfoque interesante. –

+0

@yi_H No estoy seguro de que entiendo completamente. Pero tu función necesita cambiar por cada segundo. Fond example tomemos la serie de la función f (i, x) = pow (x, 1/i), comienza zith f (x) = x luego f (x) = sqrt (x) ...y hace lo que quieres. No puede quedarse con una función por todos los segundos (de lo contrario, la probabilidad no es razón para aumentar). derecho ? –

+0

sí, puede tomar una serie de funciones o, como escribí, puede cambiar entre ellas. f (x) = (1-i) x + i sqrt (x), donde voy de 0 a 1. –

Cuestiones relacionadas