Olá!
John Balwit de novo, nós vamos olhar para
o problema nº 3 na seção intermediária da parte de teoria
da informação desse curso. Número 3 nos pede para modificar
o modelo "CoinFlipInformationContent.nlogo"
e mudá-lo para
"DiceRollInformationContent.nlogo"
Então ao invés de jogarmos uma moeda, iremos rolar um dado
Certo, vamos ver como nós faríamos isso.
Aqui está nosso modelo. E eu vou fazer isso um pouco maior para
que nós possamos ver bem as coisas.
Agora, a primeira coisa que faremos é criarmos um aquivo - nós salvaremos isso.
Como...
DiceRoll.nlogo. Okay, então vamos salvar isso... e...
Certo, então a primeira coisa que eu faria é, ao invés de jogar uma moeda,
Vou deixar vários dos elementos da interface e muito do
código backend no lugar, apenas porque usaremos isso como analogia
para fazer nosso código
Primeira coisa, para não mais jogarmos uma moeda justa,
claramente nós precisaremos de um novo botão
que diga "roll" e nós nomearemos ele para rolar um dado.
Então nós teremos um comando que é chamado "Roll"
Então, ao invés de jogar uma moeda, vamos ver o que ele faz...
Aqui diz "Flip Fair Coin", existe um procedimento no backend chamada
"Flip-fair-coin".
Nosso procedimento vai ser "Roll", e essa caixa aqui é uma caixa importante.
Isso editará isso e ao invés de "coin-results", nós chamaremos de...
se eu apertar o certo... chamaremos isso "roll-results".
Okay...
Então, vamos de novo olhar a interface. Muitas coisas quebraram quando eu mudei
aquilo, então veremos se podemos consertá-las.
Mas nós sabemos que nós teremos uma caixa que coleta os resultados das rolagens
e.. vamos voltar um pouco e ver como o programa original funcionava
porque quando eu jogava a moeda, uma cara e corar aparecia aqui
e essencialmente isso calculava a quantidade de informação usando
a equação de informação de Shannon.
E me deixe ver se eu posso fazer isso menor de novo então nós podemos ver.
Yah, e aquele conteúdo de informação mostrado aqui se você olhou nessa caixa
aqui você verá que existe um reportador que estava só olhando o valor da idade.
Então, no backend nós podemos ver que todo o trabalho interessante era feito --
não "interessante" mas, tudo mais pesado é feito por esses procedimentos aqui
que na verdade calculavam a informação de Shannon
a partir de uma tabela de probabilidade,
okay, e que a tabela de probabilidade era gerada aqui de nossa tabela de frequência
e que a tabela de frequência era feita aqui e dependia de uma palavra ou série
de palavras que eram criadas por esse procedimento.
Não temos que nos preocupar com quaisquer desses procedimentos porque
tudo que nós precisamos fazer é mudar um diferente conjunto de palavras que
representará os valores da rolagem do dado e colocaremos eles nesse "roll-results".
E nós usaremos os mesmos procedimentos para calculá-los.
Então nossa tarefa aqui é criar - uma animação, eu acho - uma imagem de um dado
e fazer que a imagem reporte - ao invés de caras e coroas - 1, 2, 3, 4, 5 ou 6.
Okay?
Então é, na verdade, um processo relativamente fácil
porque os cálculos serão feitos para nós,
nós apenas precisamos estar aptos a gerar um texto nessa janela.
Então vamos novamente olhar aqui.
Eu vou revisitar para ver como "Flip-fair-coin" funciona.
Então nós vamos ao backend e ver como "Flip-fair-coin" funciona.
É um procedimento muito simples que apenas define o resultado,
que é uma variável global, de cara ou coroa.
Então faremos nosso próprio procedimento que é análogo a esse, para "roll"...
E isso irá definir os resultados para - ao invés de caras ou coroas -
nós iremos usar 1, 2, 3, 4, 5 e 6.
Então usaremos essas variáveis - não, não variáveis - essas são strings
E elas vão se referir a essa forma que nós criaremos logo.
Agora, quando eu ver um literal como esse, suspeito de que deveríamos usá-lo
múltiplas vezes. Eu vou, na verdade, copiar e colocar no procedimento de setup
na verdade, primeiro eu vou fazer disso uma variável global. Chamá-la-emos "list"
Como nós vamos usar isso mais de uma vez, então eu vou chamar de...
e faremos um literal que nos permite... usar isso várias e várias vezes.
Então agora, ao invés de vir aqui embaixo dizendo tudo disso,
vou apenas referir a isso como "the-list".
Esse é um pequeno atalho porque sei que vou usar aquela lista daquelas
variáveis/valores de novo. Então, é legal tê-los em um lugar. Okay?
Então, definimos o resultado para um da lista. Err, que é o mesmo que feito ali.
Agora, nós temos outro procedimento que mostra o que o dado faz. Okay?
Nós quereremos animar o dado conforme isso acontece. Ok.. Agora... Vamos ver..
Nós precisaremos ter um conjunto de formas, então eu vou para o
editor de formas e mostrarei para você o primeiro
e eu vou deixar você ir por si mesmo para gerar o resto deles.
Rapidamente, nós faremos isso indo ao editor de formas
Ah, olhe, aqui há algo que já é bem parecido com um dado.
Eu vou apenas clicar esse, mudar a cor para branco, desligar o "snap to grid"
Bem.. desenhar um pequeno círculo. Duplicar aquele círculo aqui...
Duplicar aqui... duplicar aqui... Duplicar aqui... duplicar aqui...
Se eu fosse um tipo de pessoa meticulosa, eu faria linhas dessa forma para ver se
as coisas estão alinhadas. Mas eu não sou desse tipo de pessoa.. certo? Então..
Okay, nós precisamos nos assegurar de que os rotulamos corretamente
Esse seria rotulado 'um'.. ok..
e uma vez que temos um rótulo, podemos duplicar e... rotular o próximo também
E vamos mover as coisas até que pareça correto para você.
Ah, esse é um dois, e vamos fazer esse lado um quatro...
Sim, isso é um pouco entediante... Por que você não vai em frente e
me coloca no pause, vai em frente e termina todos os seis
Nós vamos precisar de... 6 dados; 1,2,3,4,5,6. Esse obviamente nº 2
E, bem, termine esse, rotule-os corretamente e quando você terminar
me coloque de volta.
Okay, agora você está de volta e eu estou salvando meu final, número 6
Nós temos todos prontos - 1,2,3,4,5,6. Um conjunto de formas em nosso editor
de formas e, agora estamos prontos para voltar ao nosso modelo e
vamos olhar ao nosso procedimento setup e no modelo original
eles fazem o set up, e definem as formas para "caras".
Nós temos essa coisa chamada "the-list", então podemos definir a forma para... ao
invés de caras, digamos, one-of the-list.
Então vamos ver o que acontece agora quando
clicamos em interface e vemos o setup
Não aqui...
Defina a forma para uma da lista e é isso...
Me pergunto se temos algum problema com letras maiúsculas/minúsculas...
Na verdade, só é permitido que as formas tenhas letras minúsculas.
Vamos ver se nós temos um problema.
Pode ser que tenhamos ao menos outro problema no código
que precisamos resolver antes de rodar o setup.
Acho que esse é o caso.
Nada com os resultados da moeda,
então mudemos nossos "coin-results" para "roll-results"
Então nós podemos usar o localizar e substituir aqui.
Mas isso só acontece por alguns minutos.
E não tem "show-roll"... to show-roll... sem "coin-results"
Troque por "roll-results"
Okay, vejamos se funciona.
Agora, clicamos em setup. Okay! Agora funciona!
Então, temos esses diferentes dados aleatórios.
Ok, agora o que não temos é que no script original...
nós temos "set result" aqui e então "show-flip".
Nós fizemos "set result" e usamos "show-roll", não fizemos isso.
"show-roll" na verdade faz mais do que apenas mostrar a rolagem do dado.
Os "show", "flip", eu diria,
na verdade mantêm a informação de quantas caras e coroas saíram e,
finalmente e de forma importante,
define o valor naquela janela roll-results para uma string como essa.
Bom, vou copiar isso, essa é uma linha importante.
Essa é a última coisa, temos que garantir é que,
entre tudo que "show-roll" faça, ele defina os resultados dessa forma.
Agora, vamos ver o que acontece. Nós damos setup, rolamos os dados.
Parece que ele define os resultados sem... Digo, nós poderíamos usar um espaço aqui.
Eu vou entrar nisso, bem, "set roll-results".
Atualmente estamos usando esse operador "word" que é um operador de concatenação.
Ele basicamente faz uma string de tudo que estiver em "roll-results"
e escreve nos resultados.
Então, eu vou usar a outra versão desse comando, que é a versão com parênteses.
Eu vou inserir um espaço ali para aparecer na string.
Vamos ver se isso conserta o problema.
Agora quando nós rolamos o dado, com certeza, nós obtemos valores inseridos ali
Ok, minha primeira tentativa de arrumar isso foi mudar..
hmm, mesmo que isso não importe muito, isso é um pouco incômodo.
Ok, agora, vamos ver.. Não temos ainda nenhuma tipo de animação.
Vamos fazer alguma animaçãozinha pra deixar legal.
O modelo antigo tinha uma "jogada de moeda".
Eles jogavam pra trás e pra frente entre algumas outras formas.
Nós podemos fazer isso também. Então nós vamos em "to show-roll",
e nós vamos dizer se "results = one" - o que nós vamos fazer? -
peça para as tartarugas repetirem 4 vezes - o que nós vamos repetir? -
nós vamos definir a forma para uma da lista.
Então 4 vezes nós vamos pedir para que eles mudem a forma.
E então nós vamos pedir para que eles esperem por meio segundo.
Ok. E então nós vamos pedir que eles definam a forma para "um".
Então, isso vai nos dar uma animaçãozinha bacana.
Isso vai girar aleatoriamente a forma em algumas coisas,
esperar um pouco e finalmente definir a forma para "um".
Então, isso é o que vai fazer se for "um".
Bem, vamos ver se está correto?
Parece que estou esquecendo de um colchete.
Então agora que temos um deles corretos, nós podemos copiar e colar.
E esse "dois", esse "três", "quatro", "cinco", "seis",
"quatro", "três", e "dois".
Ok, nós fizemos a animação, vamos ver se funciona.
Vamos voltar..
Hm, "Nada nomeado RESULTS foi definido".
Bem... Vamos olhar lá... é "set result".
Ok.
Vamos ver se funciona agora.
Parece que está funcionando.
Ok, então o que ele está fazendo é gerando uma lista,
e se nós calcularmos a informação nessa lista. Parece que está certo.
Vamos jogar o dado de novo, calcular a informação.
Então, isso está calculando a informação da frequência dessa lista aqui, certo?
Então vamos começar tudo de novo. Role uma vez.
Nós deveríamos ter um conteúdo de informação de zero, onde isso é apenas um.
Agora, se nós rolássemos duas vezes,
deveríamos ainda ter um conteúdo de informação de zero.
Porque é o mesmo valor.
Oh my gosh. Erm okay.
Aqui está! Parece que está funcionando.
Pronto!