Projete um gerador de números aleatórios em que o iésimo número tenha i% de chance de ocorrer para todos os 0 <i <14. 0 deve ter exatamente 9% de chance de ocorrer. A semente do gerador deve ser a hora do sistema. Você não pode usar uma função predefinida para geração de números aleatórios.
Basicamente, 1 tem 1% de chance de ocorrer, 2 tem 2% de chance e assim por diante, até 13, 13% de chance de ocorrer. Isso é código-golfe, então o código mais curto vence.
code-golf
math
random
probability-theory
ghosts_in_the_code
fonte
fonte
<
da desigualdade e do>
bloco de cotação estavam formando uma tag HTML.Respostas:
CJam, 14 bytes
Teste aqui.
Explicação
fonte
mR
?Python 2, 54
A expressão
f(t) = ((8*t+1)**.5+1)//2
transforma uma distribuição uniforme em uma distribuição inteira triangular, mapeando os intervalosConvertemos os dígitos de milissegundos do tempo em um flutuador uniforme de 0 a 100, fazendo isso
time.time()*1e4%100
. Na verdade,%800
substituímos a multiplicação por 8 na etapa de conversão. No final, 14 são convertidos em 0 fazendo%14
.fonte
Pitão - 14 bytes
Gera matriz com a distribuição especificada e depois escolhe uma aleatória.
Experimente online aqui .
fonte
Dyalog APL , 20 bytes
⍳13
números inteiros 1 a 13(/⍨
…)
replicam por si só, por exemplo,/⍨3
são3 3 3
e/⍨2 3
são2 2 3 3 3
n
↓
… drop n elementos (deixa a lista vazia se n > comprimento da lista)⎕TS
registro de data e hora do sistema, por exemplo, 2015 11 1 13 28 56 834⊃⌽
último elemento, ou seja, o milissegundo atual 0–999 se⌊.1×
multiplica com 0,1 e arredondar para baixo o⊃
primeiro elemento, fornece 0 se os dados estiverem vaziosfonte
Processando 3, 65
5574bytesObtenha um número aleatório de 0 a 99 (inclusive). Se o número for 0-8, imprima 0, se for 9, imprima 1, se 10-11, imprima 2, se 12-14, imprima 3, etc ...
Ninguém percebeu, mas o problema com o código antigo é que millis () retorna a quantidade de tempo que o aplicativo está sendo executado, o que daria números muito semelhantes nas execuções subseqüentes do programa. Pelo menos agora temos nano precisão!
fonte
PHP, 50 bytes
microtime
retorna o tempo como uma sequência como "0,04993000 1446409253", quando multiplico por 100, o PHP coage a sequência em 0,04993000, resultado 4,993000. Então,$t
é inicializado com um número "aleatório" em[0,100)
$t
até atingir 0fonte
;echo
vez de?><?=
, para a mesma contagem de bytes. Mas bem feito!Python3, 86 bytes
direto:
fonte
J - 28 car
Este foi bobo.
6!:0''
é oY M D h m s
horário atual como uma lista de 6 itens, em que milissegundos são representados como frações nos segundos - para alcançá-los, não temos outra opção senão multiplicar os segundos ({:
) por1e3
. Enquanto isso,#~i.14
é uma lista de zero 0s, um 1, dois 2s e assim por diante até treze 13s, e somamos isso a 100 itens100{.
.J não possui indexação cíclica, portanto, pode ser tentador usar o módulo 100 de milissegundos antes de indexar a grande lista. No entanto, podemos salvar dois caracteres usando,
$
em vez disso, estender ciclicamente a lista de 100 itens para o número de milissegundos que conseguirmos (de 0 a 60999 ) e fazer a última entrada.Não que uma lista de 60000 elementos seja usada com muita memória ou algo assim, apenas parece um exagero: P
fonte
JavaScript (ES6) 116
Esta é uma adaptação de um RNG semeado simples que eu usei em vez do RNG padrão de javascript que não pode ser semeado (e, portanto, não é reproduzível)
fonte
TI-BASIC, 18 bytes
100fPart(sub(getTime
obtém o resíduo aleatório entre 0 e 99. O número triangular (n-1) é igual a(N^2+N)/2
, então o inverso é igual a√(2y+1)-.5
. Coloque isso depois de ajustar para baixo em 9, e temos o resultadoO único problema é que, para resíduos menores que 8, obtemos uma raiz quadrada imaginária. Portanto, pegamos a parte real para obter o programa como saída 0.
fonte
Perl 5, 51 bytes
50 bytes + 1 para em
-E
vez de-e
:fonte