Este desafío es bastante simple:
se le da una matriz de enteros positivos (sin incluir 0), y tiene que seleccionar un elemento aleatorio de esta matriz.
Pero aquí está el giro:
la probabilidad de seleccionar un elemento depende del valor del entero, lo que significa que a medida que el entero se hace más grande, ¡la probabilidad de que sea seleccionado también lo hace!
Ejemplo
Te dan la matriz [4, 1, 5]
.
La probabilidad de seleccionar 4 es igual a 4 dividido por la suma de todos los elementos en la matriz , en este caso 4 / ( 4 + 1 + 5 ) = 4 / 10 =
40%
.
La probabilidad de seleccionar 1 es 1 / 10
o 10%
.
Entrada
Una serie de enteros positivos.
Salida
Devuelve el entero seleccionado si usa un método, o imprímalo directamente stdout
.
Reglas
- Este es el código de golf, por lo que gana el código más corto en bytes en cualquier idioma.
- Las lagunas estándar están prohibidas.
fuente
R , 25 bytes
Pruébalo en línea!
Explicación:
Toma una muestra
s
de tamaño1
sin reemplazo, con pesass
; estos se reescalan para ser probabilidades.Para verificar la distribución, use este enlace .
fuente
Pyth , 4 bytes
Pruébalo aquí
Guardado un byte, gracias a @Jakube, con un enfoque bastante inusual.
Pyth , 5 bytes
Pruébalo aquí!
¿Cómo?
# 1
# 2
fuente
OsmL
oOsmR
d
, luego mapasd
sobre un rango ... ¡genio!CJam (9 bytes)
Demo en línea . Este es un programa completo que toma la entrada en formato de matriz CJam en stdin e imprime el elemento seleccionado en stdout.
Disección
fuente
Perl 6 , 20 bytes
Guardado 1 byte gracias a @Brad Gilbert b2gills.
Pruébalo en línea!
Esto toma 1 argumento de lista. Comprimimos 2 copias de esta lista utilizando el
xx
operador. Entonces@_ Zxx@_
, con , obtenemos una lista en la quex
se presenta el elementox
veces. Luego se coacciona aBag
, que es una colección que almacena objetos junto con cuántas veces aparecen en la colección. Finalmente, elegimos un elemento aleatorio de esta colección conpick
, que toma los recuentos en la cuenta y hace The Right Thing ™.fuente
{bag(@_ Z=>@_).pick}
{bag(@_ Zxx@_).pick}
Python 3.6 , 44 bytes
Yay para empotrados. El otro
A
enchoices(A, A)
es unweights
argumento opcional .Pruébalo en línea!
fuente
MATL ,
86 bytes¡Pruébalo en MATL Online!
Explicación
fuente
Mathematica, 19 bytes
fuente
Ruby , 32 bytes
Pruébalo en línea!
fuente
Python 3 , 62 bytes
Pruébalo en línea!
fuente
Java (OpenJDK 8) ,
88878683 bytesPruébalo en línea!
fuente
for(r*=Math.random();;)
se necesita, o si todo lo que necesitas esr*=Math.random()
.for(;;)
bucle, esto requeriría una segunda declaración de retorno (nunca alcanzada) despuésfor(int i:a)...
de satisfacer el compilador, que sería 3 bytes más.for(int i:a)
es comoforeach
en C #. Tuve el mismo problema, pero solo usé unfor
bucle continuo. Su nueva respuesta me intriga, podría intentar robar algunas de sus ideas.J,
878 bytesEl 7 byter no es válido; Volveré a una edición anterior cuando regrese a mi computadora en un día o dos.
Pruébalo en línea!
:( seleccionar elementos aleatorios de una matriz es costoso.
8 bytes
9 bytes
Explicación
fuente
?@+/
es(?@+)/
; Me temo que tendrás que subir eso hasta 8 otra vez ...JavaScript (ES6), 50 bytes
Esperemos que sea evidente cómo funciona esto, pero lo explicaré aquí de todos modos. Ordena los enteros en orden descendente, luego elige uno al azar con una distribución beta (1 / 2,1) .
fuente
a=[4,1,5]
, obtendrás aproximadamente 18%1
, 24%4
y 58%5
, lo que sugiere que obtendrás esa distribución con cualquier entrada de longitud 3.05AB1E , 9 bytes
Pruébalo en línea!
fuente
PowerShell , 27 bytes
Pruébalo en línea!
Toma la entrada
$args[0]
como una matriz literal. Recorre cada elemento|%{...}
y cada iteración construye una nueva matriz,$_
de$_
elementos, por ejemplo, para4
esto creará una matriz@(4,4,4,4)
. Esos elementos de la matriz se canalizan aGet-Random
continuación y extraerán uno de los elementos con (pseudo) probabilidad igual. Dado que, por ejemplo,@(4,1,5)
esto nos da@(4,4,4,4,1,5,5,5,5,5)
esto satisface los requisitos de probabilidad.fuente
C # (.NET Core) ,
93898776 + 18 = 94 bytesPruébalo en línea!
Un extra de 18 bytes para
using System.Linq;
Agradecimientos
11 bytes guardados gracias a Nevay, cuya implementación de números aleatorios fue mucho más concisa (además de ser un en
int
lugar de undouble
).Degolfed
Explicación
Obtenga un número aleatorio
r
, entre 0 y la suma de elementos. Luego, en cada iteración, reste el elemento actual der
. Sir
es menor que0
, entonces devuelva este elemento. La idea es que hay porciones más grandes del número aleatorio para los números más grandes en la matriz.fuente
a=>{int i=-1,r=new Random().Next(a.Sum());for(;r>=0;)r-=a[++i];return a[i];}
Japt , 7 bytes
Pruébalo aquí
Explicación
Entrada implícita de la matriz
U
.Asigne sobre la matriz pasando cada elemento a través de una función donde
D
está el elemento actual.Genere una matriz de longitud
D
y rellénelaD
.Aplanar.
Consigue un elemento aleatorio.
fuente
CJam , 5 bytes
Pruébalo en línea! Nota: separe los números por un espacio
fuente
Perl, 31 bytes
Esto supone que la entrada son argumentos de línea de comando. Tenga en cuenta que puede quedarse sin memoria si los números son grandes.
fuente
Perl 5 , 31 + 1 (-a) = 32 bytes
Pruébalo en línea!
fuente
GolfScript , 17 bytes
Pruébalo en línea!
fuente
Carbón de leña , 12 bytes
Pruébalo en línea! El enlace es a la versión detallada del código. Como Charcoal intenta ser demasiado inteligente, tengo que usar entradas delimitadas por punto y coma para la matriz. Explicación:
fuente
Haskell , 87 bytes
Pruébalo en línea!
fuente
Javascript (ES6),
6154 bytes-7 bytes gracias a @Justin Mariner
Fragmento de código de ejemplo
fuente
eval(a.join`+`)
lugar dereduce
.[].find(m=>(n-=m)<0,n=Math.random()*eval(a.join
+))
y llamar coninput::[].find(...)
Haskell ,
7877 bytesPruébalo en línea! Ejemplo de uso:
f [1,99]
probablemente rendimientos99
.Explicación:
f
toma una lista de enterosl
y devuelve el entero seleccionado al azar comoIO Int
.l>>= \n->n<$[1..n]
construye una lista con cada elementon
repetidon
veces.randomRIO(0,sum l-1)
produce un número entero en el rango de 0 a la longitud de la lista de elementos repetidos, que es exactamente la suma de todos los elementos, menos uno para evitar una excepción fuera de límite.Bonificación: versión sin puntos de 85 bytes
Pruébalo en línea!
fuente
Bash , 51 bytes
Toma entradas separadas por espacios o por líneas nuevas en un argumento o en varios argumentos.
Pruébalo en línea!
Valide las frecuencias aleatorias con un caso de prueba más complicado.
fuente
Java 8,
127122121 bytes-1 byte gracias a @Nevay .
Utiliza un enfoque similar a la respuesta Jelly de @ErikTheOutgolfer , agregando
n
veces el elementon
a la lista, y luego selecciona uno al azar de esa lista.Explicación:
Pruébalo aquí
fuente
#shuffle
llamada al bucle for para guardar 1 bytefor(int j=i;j-->0;Collections.shuffle(l))l.add(i);
.Dyalog APL , 8 bytes
Pruébalo en línea!
¿Cómo?
/⍨
,n
copias den
para cada unon
en el argumento.⌷⍨
, en el índice de1?
, un valor aleatorio entre1
y+/
, la suma del argumentofuente
GNU APL 1.2,
2623 bytes; 1.72119 bytesEnfoque inspirado en la respuesta de Erik the Outgolfer's Jelly . Se basa en
⎕IO
ser 0 en lugar de 1, que es el valor predeterminado para GNU APL (tipo de +5 bytes para⎕IO←0
).-3, -2 bytes gracias a @ Zacharý
∇
forma de funciónForma anónima lambda
Para la explicación, usaré
⍵
para representar el argumento pasado a la función, pero es equivalente aR
en el∇
formulario.⍵∘.⍴⍵
calcula el producto externo en la lista utilizando el⍴
operador reshape ( ). Efectivamente, esto crea una tabla (como una tabla de multiplicación) pero en lugar de multiplicar, repite el elemento en la columna varias veces igual al elemento en la fila. Para el ejemplo dado en la pregunta, esto es:0 0⍉⍵∘.⍴⍵
transpone la matriz y devuelve solo la diagonal principal. Esto nos da solo las partes donde la fila y la columna⍵∘.⍴⍵
eran iguales, es decir, repetimos el número varias veces igual a su valor. Por ejemplo, esto es:∊
convierte su argumento en una lista. Usando el⍉
operador transpose ( ), tenemos un vector que contiene 3 vectores. Enlist (∊
) lo convierte en un solo vector que contiene todos los elementos.S←...
asigna este nuevo vector a vectorS
.⍴S
nos da la longitud de esa lista.?
es el operador aleatorio, por lo?⍴S
que nos da un número aleatorio entre 0 y la longitud de la lista (exclusivo) (es por eso que depende de⎕IO
ser 0; de lo contrario, está entre 1 y la longitud, inclusive).S[...]
devuelve el elemento en el índice dado.fuente
Q
, ya que nunca lo usas. Y IIRC puede eliminar la nueva línea antes del del (pequeño triángulo que marca el final de la función).<IO> <IO>⍉
en conseguir que la diagonal principal fuera algo!MATLAB, 30 bytes
Esto asume MATLAB R2015a o más reciente y con la caja de herramientas Estadísticas y Aprendizaje automático instalada.
Vea la explicación a continuación para saber cómo
repelem
se usa. La diferencia entre este más corto y el siguiente es que la caja de herramientas S&ML incluye la funcióndatasample
que se puede usar para tomar uno o más elementos de una matriz al azar (con probabilidad uniforme) que permite usar una función anónima, eliminando elinput/disp
llamadas.MATLAB, 49 bytes
Este código supone que se usa MATLAB R2015a o más reciente, ya que es cuando
repelem
se introdujo la función.repelem
es una función que toma dos parámetros, el primero es una matriz de números que se replicarán y el segundo es una matriz de cuántas veces se debe replicar el elemento correspondiente. Esencialmente, la función realiza la decodificación de longitud de ejecución proporcionando el número y la longitud de ejecución.Al proporcionar la misma entrada a ambas entradas
repelem
, terminamos con una matriz que consta de n veces más del elemento n si eso tiene sentido. Si lo proporcionaras[1 2 3]
obtendrías[1 2 2 3 3 3]
. Si lo proporcionaras[1 2 4 2]
obtendrías[1 2 2 4 4 4 4 2 2]
. Al hacer esto, significa que si seleccionamos un elemento con probabilidad uniforme (randi(m)
da un número entero aleatorio de 1 am con probabilidad uniforme), cada elemento n tiene una probabilidad n veces mayor de ser seleccionado. En el primer ejemplo de[1 2 3]
,1
tendría una probabilidad de 1/6,2
tendría una probabilidad de 2/6 y3
tendría una probabilidad de 3/6.Como nota al margen, debido a que
repelem
aún no está disponible para Octave, no puedo dar un enlace TIO. Además, debido a que Octave no se puede usar, hay una gran penalización de caracteresinput()
ydisp()
no es posible usarlo como una función anónima. Si Octave es compatiblerepelem
, se podría utilizar lo siguiente:Eso habría ahorrado 16 bytes, pero no fue así.
fuente