A falácia do jogador é um viés cognitivo em que, por engano, esperamos que coisas que ocorreram com frequência sejam menos prováveis de ocorrer no futuro e que coisas que não ocorreram há algum tempo sejam mais prováveis de acontecer em breve. Sua tarefa é implementar uma versão específica disso.
Explicação do desafio
Escreva uma função que retorne um número inteiro aleatório entre 1 e 6, inclusive. O problema: na primeira vez em que a função é executada, o resultado deve ser uniforme (dentro de 1%); no entanto, cada chamada subsequente será inclinada em favor de valores que foram lançados menos vezes anteriormente. Os detalhes específicos são os seguintes:
- O dado lembra as contagens de números gerados até agora.
- Cada resultado é ponderado com a seguinte fórmula:
- Por exemplo, se a contagem de rolos até agora for , os pesos serão , ou seja, você será 4 vezes mais chances de rolar um que um .
- Observe que a fórmula significa que um resultado de rolagem de é ponderado da mesma forma que
Regras e premissas
- Regras de E / S padrão e brechas proibidas se aplicam
- Os rolos de matriz não devem ser determinísticos. (ou seja, use um PRNG semeado a partir de uma fonte volátil, como normalmente está disponível como embutido.)
- Sua fonte aleatória deve ter um período de pelo menos 65535 ou ser uma aleatoriedade verdadeira.
- As distribuições devem estar dentro de 1% para pesos de até 255
- RNGs de 16 bits são bons o suficiente para atender aos dois requisitos acima. A maioria dos RNGs embutidos é suficiente.
- Você pode passar na distribuição atual desde que essa distribuição seja alterada pela chamada ou a distribuição pós-roll seja retornada ao lado do rolo de molde. Atualizar a distribuição / contagens faz parte desse desafio .
- Você pode usar pesos em vez de contagens. Ao fazer isso, sempre que um peso cai para 0, todos os pesos devem aumentar em 1 para obter o mesmo efeito que as contagens de armazenamento.
- Você pode usar esses pesos como repetições de elementos em uma matriz.
Boa sorte. Que os bytes estejam sempre a seu favor.
Respostas:
R , 59 bytes
Experimente online!
Mantém as contagens
T
, que são transformadas para serem usadas comoweights
argumento parasample
(que provavelmente as normaliza para somar1
).O
[<<-
operador é usado para atribuir um valor aT
um dos ambientes pai (nesse caso, o único ambiente pai é.GlobalEnv
).fonte
T
? (Além de tornar o código mais difícil de ler!)T
ouF
internamente a função, e fiquei com preguiça de alterá-la quando percebi que precisava de uma atribuição global.pawl
.Python 3 ,
11299 bytesExperimente online!
Explicação
Editar: salvou 13 bytes. Obrigado, attinat !
fonte
c,=
e soltando[0]
). Também vale a pena notar quechoices
é Python 3.6+05AB1E , 13 bytes
Experimente online!
Toma a lista de contagens como entrada. Produz o rolo e as novas contagens.
Explicação:
fonte
JavaScript (ES8), 111 bytes
Experimente online!
Quão?
Essa é uma implementação bastante ingênua e provavelmente subótima que executa a simulação conforme descrito.
Nós acompanhar as contagens em . Em cada rolo, construímos uma cadeia que consiste em cada fieira repetido vezes, e escolher uma entrada aleatória em com uma distribuição uniforme.C s i max(C)−Ci+1
fonte
APL (Dyalog Unicode) , SBCS de 32 bytes
-4 bytes usando replicar em vez de índice de intervalo.
Experimente online!
Definida como uma função que usa a distribuição atual como argumento, imprime o rolo de matriz resultante e retorna a distribuição atualizada. A primeira execução no TIO é de 100 invocações, começando com
[0,0,0,0,0,0]
, a segunda execução é fortemente inclinada para 1 com[0,100,100,100,100,100]
e a última execução é fortemente inclinada para 6 da mesma maneira.fonte
Perl 6 , 31 bytes
Experimente online!
Aceita a distribuição de peso atual como um BagHash, começando com um onde todos os pesos são 1. A distribuição é alterada no local.
O
pick
método BagHash seleciona uma chave aleatoriamente usando os pesos associados; o peso dessa chave é então decrementado em um. Se esse peso for zero,++«.{1..6}
incrementa os pesos de todos os números de 1 a 6.fonte
Wolfram Language (Mathematica) , 91 bytes
Experimente online!
fonte
Javascript (ES6 +), 97 bytes
Explicação
Observe que isso eventualmente explodirá se
w
exceder o comprimento de 2 32 -1, que é o comprimento máximo da matriz em js, mas você provavelmente atingirá um limite de memória antes disso, considerando que uma matriz int de 32 bits com comprimento de 32 -1 é 16GiB e alguns (a maioria?) Navegadores não permitem que você use mais do que 4GiB.fonte
Perl 6 , 49 bytes
Experimente online!
Toma os rolos anteriores como um saco (multiset). Retorna o novo rolo e a nova distribuição.
Explicação
fonte
Pitão ,
2220 bytesExperimente online!
A entrada é as frequências anteriores como uma lista, produz o próximo rolo e as frequências atualizadas separadas por uma nova linha.
fonte
Gelatina , 12 bytes
Experimente online!
Um link monádico que utiliza um único argumento, a lista de contagens atual e retorna uma lista do número escolhido e a lista de contagens atualizada.
Gelatina , 18 bytes
Experimente online!
Como alternativa, aqui está um link niládico que retorna o número escolhido e acompanha a lista de contagens no registro.
fonte