Introdução
Você recebe um gerador inteiro aleatório com a seguinte implementação
- A primeira chamada sempre retorna 1.
- A segunda invocação retorna um número inteiro aleatório entre 1 e 2.
- A terceira invocação retorna um número inteiro aleatório entre 1 e 3.
- A enésima invocação retorna um número inteiro aleatório entre 1 en, inclusive.
Com base na função acima, escreva um gerador aleatório de dados perfeitamente aleatório, retornando um valor entre 1 e 6 (inclusive) com igual probabilidade.
Regras
- Seu programa / função deve resultar em um número inteiro aleatório entre 1 e 6, inclusive, de alguma forma utilizável, ou seja, na saída padrão ou como um valor de retorno da função.
- O gerador ascendente de números aleatórios acima pode ser definido como uma função "livre" em seu programa (ou seja, não conta para a contagem de caracteres) ou um script / programa separado que é executado conforme necessário, assumindo que o estado (
n
) seja persistente entre chamadas. - Suponha que nunca mais de 1000 lançamentos de dados serão solicitados em um único caso de uso do seu programa, e o gerador inicial de números aleatórios poderá ser redefinido
1
no final de 1000 lançamentos de dados para evitar o transbordamenton
. - Seu programa não pode usar nenhuma outra fonte de números aleatórios, exceto o gerador aleatório ascendente definido acima. Obviamente, você pode solicitar vários números aleatórios ao gerador de números aleatórios para cada saída de dados.
- Isso é código-golfe, então o vencedor é a resposta mais curta ou a maioria dos votos em caso de empate. Se você pode gerar 1000 jogadas de dados usando menos de 1000 números aleatórios gerados, dê a si mesmo um bônus de eficiência de 10 pontos .
Exemplo
./asc-rand
1 # random integer between 1 and 1
./asc-rand
1 # random integer between 1 and 2
./asc-rand
3 # random integer between 1 and 3
./asc-rand
4 # random integer between 1 and 4
# dice-gen generates random dice based on output of asc-rand program.
./dice-gen
3
./dice-gen
6
./dice-gen
5
./dice-gen
1
iterate(6):b=asc-rand(); print b
ilegal ou não funciona? Eu posso estar entendendo mal a terceira regra.Respostas:
J - 13 car
Isso faz as mesmas suposições que o Golfscript: que o número de dados está em stdin e listamos os dados que serão lançados.
Explicado por explosão:
Se isso é insatisfatório, aqui está um programa mais longo de 21 caracteres, que pode ser chamado
f''
para gerar números aleatórios, apresentando um estado e tudo.fonte
r:{*1_draw x}
, versão stdin (10 caracteres)r'1+!. 0:`
, versão da função (14 caracteres)c:0;f:{r@c+:1}
chamada porf[]
.Python, 31 caracteres
Da mesma forma que o scleaver, defina o gerador como este:
Em seguida, uma função para retornar dados:
Ligue
D()
sempre que precisar de um lançamento de dados uniformemente aleatório.fonte
Scala 23
O método r pode ser (aprox.) Implementado assim:
um teste aproximado:
Cada 6ª chamada deve produzir uma distribuição igual sobre os 6 valores, então eu jogo fora 5.
fonte
GolfScript (15 caracteres)
Isso pressupõe que o número de rolos necessários seja fornecido no stdin e lista muitos resultados para o stdout.
Demonstração online
Embora eu pudesse obter o bônus de 10 pontos por usar menos de 1000 rolos para gerar 1000 números, isso me custaria muito mais que 10 caracteres. A abordagem trivial de extrair entropia adequada quando N é um múltiplo de uma potência de 2 ou 3 fica muito aquém porque o número de resultados disponíveis mod 3 é apenas 333 + 111 + 37 + 12 + 4 + 1 = 498. Portanto, é necessário adote uma abordagem de amostra e rejeição. Usando essa abordagem, você pode obter 2242 rolos esperados de 1.000 chamadas para
r
, mas há uma sobrecarga extra da contabilidade ebase
é um nome de função muito longo.fonte
base
é um nome de função muito longo" Você aparentemente não usa o Mathematica . Ficamos com maravilhas comoNegativeBinomialDistribution
,ExponentialGeneratingFunction
,MathieuCharacteristicExponent
,InverseFourierSequenceTransform
, eSemialgebraicComponentInstances
. :-)Python
6563A função
R()
é o randomizador ascendente.Uso:
fonte
for
loop e ligar apenasR
uma vez antes dowhile
loop?R()
estava retornando um carro alegórico e você estava pegando o dígito menos significativo. Agora que foi esclarecido queR()
retorna um número inteiro, faz sentido.Python, 56
r é definido como:
o gerador de dados d:
uso, por exemplo, para 100 rolos:
fonte
import math
se substituirmath.ceil(...)
comint(...)+1
Mathematica 51
O gerador de números aleatórios,,
r
é redefinido definindo a variável globaln
como 1.Código
Não está em execução pelo código mais curto ...
Uso
60000 jogadas dos dados exigiram 60031 chamadas
h
.Tally
mostra a repartição pelos números 1 a 6.fonte
Perl, 22 ou 45
Implementação do gerador de números aleatórios ascendente:
Gerando:
Testando:
fonte
JavaScript (Node.js) , 35 bytes
Experimente online!
fonte
x86 opcode, 15 bytes
fonte
GolfScript , 8 bytes
Experimente online!
Ele aciona o gerador uma vez e depois se livra do resultado. Em seguida, ele rola f2 e multiplica por 3 (3 ou 6) e subtrai f3-1 (0, 1, 2), o que resulta em (3-2, 3-1, 3-0) ou (6-2, 6-1, 6-0) W5.
O Golfscript e a função aleatória existiam antes desta pergunta ser publicada, assim como uma submissão legal.
Esse é o envio somente uma vez. Se você precisar executá-lo várias vezes em uma chamada,
GolfScript , 12 bytes
Experimente online!
Isso redefine sua chamada para 0, para que seja redefinida de acordo. Este TIO mostra 50 resultados aleatórios.
fonte
C (gcc) , 31 bytes
A cada 6 chamadas, a probabilidade de cada número entre 1 e 6 inclusive ser gerado é igual.
c
é#define
d como uma chamada para uma função que gera os números aleatórios perfeitos.Experimente online!
fonte