Esta declaración suele tener éxito al generar 3 números aleatorios únicos, pero a veces solo genera 2 números únicos.

rand(1:length(matches), 3)

¿Cómo puedo reescribir esto para asegurarme de que siempre se generen 3 números aleatorios únicos? (Estoy abierto a usar otras funciones, etc. también)

Gracias

12
haxtar 16 ago. 2016 a las 19:13

2 respuestas

La mejor respuesta

Respuesta simple: (explicación más completa a continuación)

using StatsBase
MyRand = sample(1:10, 3, replace = false)   

Hay muchas complicaciones que podrían incluir en esto. Por ejemplo, cuando se extraen números aleatorios, siempre se extrae alguna distribución. Si está extrayendo muchos números aleatorios, la descripción habitual de esto en las estadísticas es que está extrayendo de una distribución multidimensional. Si su distribución es discreta (es decir, cualquier número específico tiene una probabilidad positiva de ser seleccionado), en realidad será una distribución diferente si especifica que dos entradas no pueden ser iguales entre sí. Por lo tanto, dependiendo exactamente de lo que desee, esto podría volverse relativamente complicado con relativa rapidez. P.ej. si desea 5 variables aleatorias de Poisson pero con la estipulación de que no hay dos iguales entre sí, lograr esto en el código es relativamente sencillo, pero los detalles de la distribución que producirían esto son más complicados y las variables que dibuje ya no ser variables aleatorias estándar de Poisson. Dependiendo de su aplicación, esto podría o no ser importante para que lo tenga en cuenta.

PERO, en este caso, parece que solo está buscando seleccionar tres elementos aleatorios de una lista de algún tipo, asignando la misma probabilidad a cada uno de los seleccionados y asegurándose de que ningún elemento se seleccione dos veces. En este caso, la función sample() de StatsBase hará el truco, con la selección de la opción replace = false (es decir, muestrear "sin reemplazo", lo que significa que elimina un número del grupo de resultados posibles una vez que se selecciona).

10
Michael Ohlrogge 18 ago. 2016 a las 20:31

La función de muestra en StatsBase tiene una opción replace.

E.g.

using StatsBase
sample(1:10, 3, replace=false)

Documentos aquí: https://statsbasejl.readthedocs.io/en/latest/

12
Alexander Morley 16 ago. 2016 a las 16:22