Esse desafio é bastante simples:
você recebe uma matriz de números inteiros positivos (sem incluir 0) e precisa selecionar um elemento aleatório nessa matriz.
Mas aqui está a diferença:
a probabilidade de selecionar um elemento depende do valor do número inteiro, ou seja, à medida que o número inteiro aumenta, a probabilidade de ele ser selecionado também!
Exemplo
Você recebe a matriz [4, 1, 5]
.
A probabilidade de selecionar 4 é igual a 4 dividido pela soma de todos os elementos na matriz , neste caso 4 / ( 4 + 1 + 5 ) = 4 / 10 =
40%
.
A probabilidade de selecionar 1 é 1 / 10
ou 10%
.
Entrada
Uma matriz de números inteiros positivos.
Resultado
Retorne o número inteiro selecionado se estiver usando um método ou imprima-o diretamente para stdout
.
Regras
- Este é o código-golfe, pelo que o código mais curto em bytes em qualquer idioma vence.
- As brechas padrão são proibidas.
fonte
R , 25 bytes
Experimente online!
Explicação:
Retira uma amostra do
s
tamanho1
sem reposição, com pesoss
; estes são redimensionados para serem probabilidades.Para verificar a distribuição, use este link .
fonte
Pitão , 4 bytes
Experimente aqui.
Salvo um byte, graças a @Jakube, com uma abordagem bastante incomum.
Pitão , 5 bytes
Experimente aqui!
Quão?
# 1
# 2
fonte
OsmL
ouOsmR
d
, depois mapeiad
em um intervalo ... gênio!CJam (9 bytes)
Demonstração online . Este é um programa completo que recebe entrada no formato de array CJam no stdin e imprime o elemento selecionado no stdout.
Dissecação
fonte
Perl 6 , 20 bytes
Guardou 1 byte graças a @Brad Gilbert b2gills.
Experimente online!
Isso leva 1 argumento da lista. Zipamos duas cópias desta lista usando o
xx
operador. Assim@_ Zxx@_
, obtemos uma lista na qual o elementox
é apresentadox
vezes. Em seguida, ele é coagidoBag
, que é uma coleção que armazena objetos e quantas vezes eles aparecem na coleção. Finalmente, escolhemos um elemento aleatório desta coleção compick
, que leva as contagens para a conta e faz The Right Thing ™.fonte
{bag(@_ Z=>@_).pick}
{bag(@_ Zxx@_).pick}
Python 3.6 , 44 bytes
Yay para embutidos. O outro
A
emchoices(A, A)
é umweights
argumento opcional .Experimente online!
fonte
MATL ,
86 bytesExperimente no MATL Online!
Explicação
fonte
Mathematica, 19 bytes
fonte
Ruby , 32 bytes
Experimente online!
fonte
Python 3 , 62 bytes
Experimente online!
fonte
Java (OpenJDK 8) ,
88878683 bytesExperimente online!
fonte
for(r*=Math.random();;)
é necessário ou se tudo o que você precisa ér*=Math.random()
.for(;;)
loop, isso exigiria uma segunda declaração de retorno (nunca alcançada) após afor(int i:a)...
para satisfazer o compilador - que seria 3 bytes mais longo.for(int i:a)
é como umforeach
em C #. Eu tive o mesmo problema, mas apenas usei umfor
que continuamente circula. Sua nova resposta me intriga, posso tentar roubar algumas de suas idéias.J,
878 bytesO byter 7 é inválido; Vou reverter isso para uma edição anterior quando voltar ao meu computador em um dia ou dois.
Experimente online!
:( selecionar elementos aleatórios de uma matriz é caro.
8 bytes
9 bytes
Explicação
fonte
?@+/
é(?@+)/
; Eu tenho medo que você terá que aumentar isso até 8 novamente ...JavaScript (ES6), 50 bytes
Espero que seja aparente como isso funciona, mas eu explicarei aqui de qualquer maneira. Classifica os números inteiros em ordem decrescente e escolhe um aleatoriamente com uma distribuição beta (1 / 2,1) .
fonte
a=[4,1,5]
, você terá cerca de 18%1
, 24%4
e 58%5
, o que sugere que você vai ter que a distribuição com qualquer entrada de comprimento 3.05AB1E , 9 bytes
Experimente online!
fonte
PowerShell , 27 bytes
Experimente online!
Recebe entrada
$args[0]
como uma matriz literal. Os loops através de cada elemento|%{...}
e cada iteração constroem uma nova matriz,$_
de$_
elementos - por exemplo, para4
isso criará uma matriz@(4,4,4,4)
. Esses elementos da matriz são então canalizados para osGet-Random
quais extrairão um dos elementos com (pseudo) probabilidade igual. Uma vez que, por exemplo,@(4,1,5)
isso nos dá@(4,4,4,4,1,5,5,5,5,5)
isso satisfaz os requisitos de probabilidade.fonte
C # (.NET Core) ,
93898776 + 18 = 94 bytesExperimente online!
18 bytes extras para
using System.Linq;
Reconhecimentos
11 bytes salvos graças a Nevay, cuja implementação de números aleatórios era muito mais concisa (além de ser um em
int
vez de adouble
).Degolfed
Explicação
Obtenha um número aleatório,,
r
entre 0 e soma dos elementos. Em cada iteração, subtraia o elemento atual der
. Ser
for menor que0
, retorne esse elemento. A ideia é que existam partes maiores do número aleatório para os números maiores na matriz.fonte
a=>{int i=-1,r=new Random().Next(a.Sum());for(;r>=0;)r-=a[++i];return a[i];}
Japonês , 7 bytes
Teste aqui
Explicação
Entrada implícita da matriz
U
.Mapeie a matriz passando cada elemento através de uma função onde
D
está o elemento atual.Gere uma matriz de comprimento
D
e preencha comD
.Aplainar.
Obtenha um elemento aleatório.
fonte
CJam , 5 bytes
Experimente online! Nota: números separados por um espaço
fonte
Perl, 31 bytes
Isso pressupõe que a entrada seja argumentos de linha de comando. Observe que pode ficar sem memória se os números forem grandes.
fonte
Perl 5 , 31 + 1 (-a) = 32 bytes
Experimente online!
fonte
GolfScript , 17 bytes
Experimente online!
fonte
Carvão , 12 bytes
Experimente online! Link é a versão detalhada do código. Como o Charcoal tenta ser inteligente demais, estou tendo que usar a entrada delimitada por ponto e vírgula para a matriz. Explicação:
fonte
Haskell , 87 bytes
Experimente online!
fonte
Javascript (ES6),
6154 bytes-7 bytes graças a Justin Mariner
Fragmento de código de exemplo
fonte
eval(a.join`+`)
vez dereduce
.[].find(m=>(n-=m)<0,n=Math.random()*eval(a.join
+))
e chamada cominput::[].find(...)
Haskell ,
7877 bytesExperimente online! Exemplo de uso:
f [1,99]
provavelmente produz99
.Explicação:
f
pega uma lista de números inteirosl
e retorna o número inteiro selecionado aleatoriamente comoIO Int
.l>>= \n->n<$[1..n]
constrói uma lista com cada elementon
repetidon
vezes.randomRIO(0,sum l-1)
gera um número inteiro no intervalo de 0 ao comprimento da lista de elementos repetidos, que é exatamente a soma de todos os elementos, menos um para evitar uma exceção fora do limite.Bônus: versão sem pontos de 85 bytes
Experimente online!
fonte
Bash , 51 bytes
Recebe entrada separada por espaço ou separada por nova linha em um argumento ou em vários argumentos.
Experimente online!
Valide as frequências aleatórias com um caso de teste mais complicado.
fonte
Java 8,
127122121 bytes-1 byte graças a @Nevay .
Usa uma abordagem semelhante à resposta Jelly de @ErikTheOutgolfer , adicionando
n
o itemn
à lista de tempos e, em seguida, selecione um aleatoriamente nessa lista.Explicação:
Experimente aqui.
fonte
#shuffle
chamada para o loop for para economizar 1 bytefor(int j=i;j-->0;Collections.shuffle(l))l.add(i);
.Dyalog APL , 8 bytes
Experimente online!
Quão?
/⍨
,n
cópias den
para cada umn
no argumento.⌷⍨
, no índice de1?
, um valor aleatório entre1
e+/
, a soma do argumentofonte
GNU APL 1.2,
2623 bytes; 1,72119 bytesAbordagem inspirada na resposta de Erik, o Outgolfer's Jelly . Confia em
⎕IO
ser 0 em vez de 1, que é o padrão para GNU APL (tipo de +5 bytes para⎕IO←0
).-3, -2 bytes graças a @ Zacharý
∇
formulário de funçãoFormulário lambda anônimo
Para a explicação, usarei
⍵
para representar o argumento passado para a função, mas é equivalente aR
no∇
formulário.⍵∘.⍴⍵
calcula o produto externo na lista usando o⍴
operador reshape ( ). Efetivamente, isso cria uma tabela (como uma tabela de multiplicação), mas, em vez de multiplicar, repete o elemento na coluna várias vezes igual ao elemento na linha. Para o exemplo dado na pergunta, este é:0 0⍉⍵∘.⍴⍵
transpõe a matriz e retorna apenas a diagonal principal. Isso nos fornece apenas as partes em que a linha e a coluna⍵∘.⍴⍵
eram iguais, ou seja, repetimos o número várias vezes igual ao seu valor. Para o exemplo, isto é:∊
transforma seu argumento em uma lista. Usando o⍉
operador transpose ( ), obtivemos um vetor contendo 3 vetores. Enlist (∊
) o transforma em um único vetor contendo todos os elementos.S←...
atribui esse novo vetor ao vetorS
.⍴S
nos dá o comprimento dessa lista.?
é o operador aleatório, portanto,?⍴S
nos fornece um número aleatório entre 0 e o comprimento da lista (exclusivo) (é por isso que ele depende de⎕IO
ser 0; caso contrário, está entre 1 e o comprimento, inclusive).S[...]
retorna o elemento no índice fornecido.fonte
Q
, pois nunca o usa. E no IIRC você pode remover a nova linha antes do del (coisinha triangular que marca o final da função).<IO> <IO>⍉
em obter a diagonal principal foi uma coisa!MATLAB, 30 bytes
Isso pressupõe o MATLAB R2015a ou mais recente e com a caixa de ferramentas Estatísticas e aprendizado de máquina instalada.
Veja a explicação abaixo para saber como
repelem
é usado. A diferença entre este menor e o abaixo é que a caixa de ferramentas S&ML inclui a funçãodatasample
que pode ser usada para obter um ou mais elementos de uma matriz aleatoriamente (com probabilidade uniforme), o que permite que uma função anônima seja usada, eliminando oinput/disp
chamadas.MATLAB, 49 bytes
Este código pressupõe que o MATLAB R2015a ou mais recente seja usado como quando a
repelem
função foi introduzida.repelem
é uma função que aceita dois parâmetros, o primeiro é uma matriz de números a serem replicados e a segunda é uma matriz de quantas vezes o elemento correspondente deve ser replicado. Essencialmente, a função executa decodificação de duração, fornecendo o número e a duração.Ao fornecer a mesma entrada para ambas as entradas
repelem
, terminamos com uma matriz que consiste em n vezes mais do elemento n, se isso faz sentido. Se você forneceu[1 2 3]
, receberia[1 2 2 3 3 3]
. Se você forneceu[1 2 4 2]
, receberia[1 2 2 4 4 4 4 2 2]
. Ao fazer isso, significa que, se selecionarmos um elemento com probabilidade uniforme (randi(m)
fornecer um número inteiro aleatório de 1 a m com probabilidade uniforme), cada elemento n terá uma probabilidade n vezes maior de ser selecionado. No primeiro exemplo de[1 2 3]
,1
teria uma chance de 1/6,2
teria uma chance de 2/6 e3
teria uma chance de 3/6.Como uma observação lateral, como
repelem
ainda não está disponível para o Octave, não posso fornecer um link TIO. Além disso, porque Octave não pode ser utilizado há uma penalidade de caráter grande quantoinput()
edisp()
necessidade de ser usado como uma função anônima não é possível. Se o Octave suportasserepelem
, o seguinte poderia ser usado:Isso teria economizado 16 bytes, mas não era para ser.
fonte