Olá, Visitante. Por favor entre ou registe-se se ainda não for membro.

Entrar com nome de utilizador, password e duração da sessão
 

Autor Tópico: Monty Hall problem - para testar  (Lida 324 vezes)

Thorn Gilts

  • Ordem dos Especialistas
  • Hero Member
  • *****
  • Mensagens: 14244
    • Ver Perfil
Monty Hall problem - para testar
« em: 2023-01-05 12:48:16 »
Olá,

Para testar a teoria do Monty Hall na realidade envio-te em anexo uma folha de excel com macro. Abaixo os algoritmos para poderes verificar (são intuitivos - vê as descrições) que não há qualquer bias.

Como utilizar a folha:

1- Na celular amarela colocas o número de interações (loops), quanto maior o número mais precisos são os resultados, mas também demora mais tempo;

2- No botão "rock & roll" faz a simulação toda seguida, considerando o número de interações e apresenta os resultados no fim;

3- No botão "Step by step" faz a simulação sorteio a sorteio e permite-te escolher se vais trocar a porta ao não. Vais verificar se nunca trocares terás um acerto de aproximadamente 1/3 face a se trocares sempre que será de 2/3.

:-) diverte-te e brinca com o teu irmão.


Sub LOOPPING()
Dim Total As Integer
Dim Count As Integer

' clear
Application.CalculateFullRebuild
Application.ScreenUpdating = True
Range("F4").Value = 0
Range("B5").Value = 0
Range("C5").Value = 0
Range("D5").Value = 0
Range("F4").Value = 0
Range("B5").Value = 0
Range("C5").Value = 0
Range("D5").Value = 0
Range("C10").Value = 0
Range("C20").Value = 0
Application.CalculateFullRebuild
Application.ScreenUpdating = True


If Range("G4").Value = Empty Then Range("G4").Value = 1000
Looping = Range("F4").Value
Total = Range("G4").Value
For Count = 1 To Total

door = WorksheetFunction.RandBetween(1, 3) ' o premío - escolha aleatória entre a porta 1 e 3
Range("B3").Value = door ' registo da porta premiada

' registo das percentagens de saidas de prémios para cada uma das 3 portas
If door = 1 Then
Range("B4").Value = "X"
Range("B5").Value = Range("B5").Value + 1
Range("C4").Value = "-"
Range("D4").Value = "-"
End If
If door = 2 Then
Range("C4").Value = "X"
Range("C5").Value = Range("C5").Value + 1
Range("B4").Value = "-"
Range("D4").Value = "-"
End If
If door = 3 Then
Range("D4").Value = "X"
Range("D5").Value = Range("D5").Value + 1
Range("B4").Value = "-"
Range("C4").Value = "-"
End If

choosen = WorksheetFunction.RandBetween(1, 3) ' a nossa porta - escolha aleatoria entre a porta 1 e 3
Range("C9").Value = choosen ' registo da porta escolhida


' a porta a mostrar
If (door = 1 Or door = 2) And (choosen = 1 Or choosen = 2) Then opendoor = 3
If (door = 2 Or door = 3) And (choosen = 2 Or choosen = 3) Then opendoor = 1
If (door = 3 Or door = 1) And (choosen = 3 Or choosen = 1) Then opendoor = 2
Range("C14").Value = opendoor ' registo da porta mostrar


' a porta a trocar
If (opendoor = 1 Or opendoor = 2) And (choosen = 1 Or choosen = 2) Then swap = 3
If (opendoor = 2 Or opendoor = 3) And (choosen = 2 Or choosen = 3) Then swap = 1
If (opendoor = 3 Or opendoor = 1) And (choosen = 3 Or choosen = 1) Then swap = 2
Range("C19").Value = swap ' registo da porta trocada


' registo das percentagens de acertos na porta escolhida
If door = choosen Then
Range("C10").Value = Range("C10").Value + 1
End If

' registo das percetnagem de acertos na porta trocada
If door = swap Then
Range("C20").Value = Range("C20").Value + 1
End If

Application.CalculateFullRebuild
Application.ScreenUpdating = True
Looping = Looping + 1
Range("F4").Value = Looping

Application.CalculateFullRebuild
Application.ScreenUpdating = True

Range("B4").Value = "-"
Range("C4").Value = "-"
Range("D4").Value = "-"


Next Count
MsgBox "DONE. If you swaped the door you won " & Format(Range("C21").Value, "#.00 %") & " of the time"
End Sub

Sub stepbystep()
Dim Total As Integer
Dim Count As Integer
Application.CalculateFullRebuild
Application.ScreenUpdating = True
Range("F4").Value = 0
Range("B5").Value = 0
Range("C5").Value = 0
Range("D5").Value = 0
Range("F4").Value = 0
Range("B5").Value = 0
Range("C5").Value = 0
Range("D5").Value = 0
Range("C10").Value = 0
Range("C20").Value = 0
Range("I14").Value = 0
Application.CalculateFullRebuild
Application.ScreenUpdating = True
If Range("G4").Value = Empty Then Range("G4").Value = 1000
Looping = Range("F4").Value
Total = Range("G4").Value
For Count = 1 To Total

door = WorksheetFunction.RandBetween(1, 3) ' o premío - escolha aleatória entre a porta 1 e 3
Range("B3").Value = door ' registo da porta premiada

' registo das percentagens de saidas de prémios para cada uma das 3 portas
If door = 1 Then
Range("B4").Value = "X"
Range("B5").Value = Range("B5").Value + 1
Range("C4").Value = "-"
Range("D4").Value = "-"
End If
If door = 2 Then
Range("C4").Value = "X"
Range("C5").Value = Range("C5").Value + 1
Range("B4").Value = "-"
Range("D4").Value = "-"
End If
If door = 3 Then
Range("D4").Value = "X"
Range("D5").Value = Range("D5").Value + 1
Range("B4").Value = "-"
Range("C4").Value = "-"
End If

choosen = WorksheetFunction.RandBetween(1, 3) ' a nossa porta - escolha aleatoria entre a porta 1 e 3
Range("C9").Value = choosen ' registo da porta escolhida

Application.CalculateFullRebuild
Application.ScreenUpdating = True

' a porta a mostrar
If (door = 1 Or door = 2) And (choosen = 1 Or choosen = 2) Then opendoor = 3
If (door = 2 Or door = 3) And (choosen = 2 Or choosen = 3) Then opendoor = 1
If (door = 3 Or door = 1) And (choosen = 3 Or choosen = 1) Then opendoor = 2
Range("C14").Value = opendoor ' registo da porta mostrar

Application.CalculateFullRebuild
Application.ScreenUpdating = True

' a porta a trocar
If (opendoor = 1 Or opendoor = 2) And (choosen = 1 Or choosen = 2) Then swap = 3
If (opendoor = 2 Or opendoor = 3) And (choosen = 2 Or choosen = 3) Then swap = 1
If (opendoor = 3 Or opendoor = 1) And (choosen = 3 Or choosen = 1) Then swap = 2
Range("C19").Value = swap ' registo da porta trocada

Application.CalculateFullRebuild
Application.ScreenUpdating = True


answer = MsgBox("You choose door " & choosen & ". Do you wanna swap?", vbQuestion + vbYesNo + vbDefaultButton2, "YOU CHOOSE!")


' registo das percentagens de acertos na porta escolhida
If door = choosen And answer = vbNo Then
Range("I14").Value = Range("I14").Value + 1
End If

' registo das percetnagem de acertos na porta trocada
If door = swap And answer = vbYes Then
Range("I14").Value = Range("I14").Value + 1
End If


Looping = Looping + 1
Range("F4").Value = Looping
Application.CalculateFullRebuild
Application.ScreenUpdating = True

Range("B4").Value = "-"
Range("C4").Value = "-"
Range("D4").Value = "-"
Application.CalculateFullRebuild

Next Count
MsgBox "DONE. If you swaped the door you won " & Format(Range("I15").Value, "#.00 %") & " of the time"
End Sub


Sub CLEAR()
Application.CalculateFullRebuild
Application.ScreenUpdating = True
Range("F4").Value = 0
Range("B5").Value = 0
Range("C5").Value = 0
Range("D5").Value = 0
Range("F4").Value = 0
Range("B5").Value = 0
Range("C5").Value = 0
Range("D5").Value = 0
Range("C10").Value = 0
Range("C20").Value = 0
Range("I14").Value = 0
Application.CalculateFullRebuild
Application.ScreenUpdating = True
End Sub
we all have a story we nevel tell

Thorn Gilts

  • Ordem dos Especialistas
  • Hero Member
  • *****
  • Mensagens: 14244
    • Ver Perfil
Re: Monty Hall problem - para testar
« Responder #1 em: 2023-01-05 12:58:28 »
we all have a story we nevel tell