{"id":1444,"date":"2025-08-06T17:09:40","date_gmt":"2025-08-06T20:09:40","guid":{"rendered":"https:\/\/www.galirows.com.br\/meublog\/programacao\/?p=1444"},"modified":"2025-08-06T17:13:25","modified_gmt":"2025-08-06T20:13:25","slug":"explicacao-sobre-aleatoriedade-aplicacao-com-o-dilema-do-prisioneiro","status":"publish","type":"post","link":"http:\/\/www.galirows.com.br\/meublog\/programacao\/explicacao-sobre-aleatoriedade-aplicacao-com-o-dilema-do-prisioneiro\/","title":{"rendered":"Explica\u00e7\u00e3o sobre aleatoriedade &#8211; aplica\u00e7\u00e3o com o Dilema do Prisioneiro"},"content":{"rendered":"\n<p>Muitas vezes gera\u00e7\u00e3o de n\u00fameros aleat\u00f3rios \u00e9 explicada a partir de jogar uma moeda ou de um dado (eu mesmo j\u00e1 fiz isso <a href=\"https:\/\/www.galirows.com.br\/meublog\/programacao\/guia-definitivo-valores-aleatorios-c\/\" data-type=\"post\" data-id=\"1207\">aqui<\/a>), embora seja interessante explicar com outras aplica\u00e7\u00f5es, como eu mesmo <a href=\"https:\/\/www.galirows.com.br\/meublog\/programacao\/algoritmo-problema-monty-hall\/\" data-type=\"post\" data-id=\"1387\">j\u00e1 fiz associando com o problema de Monty Hill<\/a>. Dessa vez explico a aleatoriedade a partir da elabora\u00e7\u00e3o de uma simula\u00e7\u00e3o para o Dilema do Prisioneiro. Inicialmente explico todo o dilema e depois fa\u00e7o c\u00f3digos para a simula\u00e7\u00e3o.<\/p>\n\n\n\n<p>O <strong>Dilema do Prisioneiro<\/strong> \u00e9 um conceito da Teoria dos Jogos que ilustra a dificuldade em se obter coopera\u00e7\u00e3o entre dois indiv\u00edduos, mesmo que a colabora\u00e7\u00e3o m\u00fatua gere o melhor resultado para ambos. O dilema demonstra como a busca pelo interesse pr\u00f3prio pode levar a um desfecho desfavor\u00e1vel para todos os envolvidos.<\/p>\n\n\n\n<p>A ess\u00eancia do problema reside em um cen\u00e1rio hipot\u00e9tico envolvendo dois prisioneiros, c\u00famplices de um crime, que s\u00e3o presos e mantidos em celas separadas, sem qualquer meio de comunica\u00e7\u00e3o. A pol\u00edcia n\u00e3o possui provas suficientes para conden\u00e1-los pelo crime principal, apenas por uma ofensa menor. Aos dois prisioneiros \u00e9 oferecido o mesmo acordo, e as consequ\u00eancias de suas decis\u00f5es s\u00e3o interdependentes.<\/p>\n\n\n\n<p>A situa\u00e7\u00e3o pode ser resumida da seguinte forma:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Se ambos os prisioneiros confessarem (tra\u00edrem um ao outro):<\/strong> Ambos receber\u00e3o uma pena moderada, por exemplo, 5 anos de pris\u00e3o cada.<\/li>\n\n\n\n<li><strong>Se ambos os prisioneiros permanecerem em sil\u00eancio (cooperarem um com o outro):<\/strong> Ambos ser\u00e3o condenados pela ofensa menor e receber\u00e3o uma pena leve, por exemplo, 1 ano de pris\u00e3o cada.<\/li>\n\n\n\n<li><strong>Se um prisioneiro confessar (trair o outro) e o outro permanecer em sil\u00eancio:<\/strong> O que confessou ser\u00e1 libertado, enquanto o que permaneceu em sil\u00eancio receber\u00e1 uma pena severa, por exemplo, 10 anos de pris\u00e3o.<\/li>\n<\/ul>\n\n\n\n<p>O diagrama mostra que, independentemente da escolha do seu c\u00famplice, a sua melhor op\u00e7\u00e3o individual \u00e9 sempre trair. Voc\u00ea ou sai livre ou pega uma pena menor do que pegaria se cooperasse:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Se o Prisioneiro B ficar em sil\u00eancio:<\/strong> A melhor op\u00e7\u00e3o para o Prisioneiro A \u00e9 confessar, pois assim ele sair\u00e1 livre em vez de cumprir 1 ano de pris\u00e3o.<\/li>\n\n\n\n<li><strong>Se o Prisioneiro B confessar:<\/strong> A melhor op\u00e7\u00e3o para o Prisioneiro A \u00e9 tamb\u00e9m confessar, pois assim ele pegar\u00e1 5 anos em vez dos 10 que pegaria se ficasse em sil\u00eancio.<\/li>\n<\/ul>\n\n\n\n<p>Como ambos os prisioneiros seguem a mesma l\u00f3gica racional, ambos acabam confessando e recebendo uma pena de 5 anos cada. Este resultado \u00e9 conhecido como <strong>Equil\u00edbrio de Nash<\/strong>, um estado em que nenhum jogador pode melhorar sua situa\u00e7\u00e3o mudando sua estrat\u00e9gia unilateralmente.<\/p>\n\n\n\n<p>O paradoxo \u00e9 que, se ambos tivessem cooperado (ficado em sil\u00eancio), teriam obtido um resultado muito melhor para o grupo (apenas 1 ano de pris\u00e3o cada). A busca pelo melhor resultado individual leva a um resultado coletivo pior.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Simula\u00e7\u00e3o do Dilema do Prisioneiro<\/h2>\n\n\n\n<p>Para simula\u00e7\u00e3o, vou considerar 2 cen\u00e1rios:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Prisioneiros Aleat\u00f3rios:<\/strong> cada agente n\u00e3o tem um estrat\u00e9gia e &#8220;sorteia&#8221; que ir\u00e1 fazer. Considerei que em 80% das vezes ele ir\u00e1 decidir baseado na mesma l\u00f3gica racional (que seria confessar), mas recomendo que experimente outros valores.<\/li>\n\n\n\n<li><strong>Estrat\u00e9gia &#8220;Olho por Olho&#8221; (Tit-for-Tat):<\/strong> Os prisioneiros s\u00e3o cooperativos. Eles come\u00e7am cooperando na primeira rodada e a partir da segunda rodada, cada prisioneiro simplesmente copia a jogada anterior do seu oponente. Se o oponente cooperou na rodada passada, ele coopera. Se o oponente traiu, ele trai. Logicamente que, se ambos iniciam cooperando e depois seguem repetindo o anterior, eles ir\u00e3o cooperar do come\u00e7o ao fim, por isso coloquei que cada prisioneiro tem 80% de chance trair seu companheiro.<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"c\" class=\"language-c\">import random\n\n# --- Constantes para as escolhas ---\n# Usar n\u00fameros facilita a l\u00f3gica, mas as constantes tornam o c\u00f3digo mais leg\u00edvel.\nCOOPERAR = 0\nTRAIR = 1 # O mesmo que \"confessar\"\n\n# --- Configura\u00e7\u00f5es da Simula\u00e7\u00e3o ---\nNUMERO_DE_RODADAS = 1000\nPROBABILIDADE_TRAIR = 0.8 # 80% de chance de trair no cen\u00e1rio aleat\u00f3rio e no modificado\n\ndef dilema_do_prisioneiro(escolha_p1, escolha_p2):\n    \"\"\"\n    Calcula a senten\u00e7a para cada prisioneiro com base em suas escolhas.\n    Retorna uma tupla com (senten\u00e7a_p1, senten\u00e7a_p2).\n    \"\"\"\n    if escolha_p1 == COOPERAR and escolha_p2 == COOPERAR:\n        # Ambos cooperam: pena branda para os dois.\n        return (1, 1)\n    elif escolha_p1 == COOPERAR and escolha_p2 == TRAIR:\n        # P1 coopera, P2 trai: P1 recebe a pena m\u00e1xima, P2 sai livre.\n        return (10, 0)\n    elif escolha_p1 == TRAIR and escolha_p2 == COOPERAR:\n        # P1 trai, P2 coopera: P1 sai livre, P2 recebe a pena m\u00e1xima.\n        return (0, 10)\n    elif escolha_p1 == TRAIR and escolha_p2 == TRAIR:\n        # Ambos traem: pena intermedi\u00e1ria para os dois.\n        return (5, 5)\n\ndef simular_cenario_aleatorio():\n    \"\"\"\n    Simula o dilema com prisioneiros que decidem de forma aleat\u00f3ria,\n    com uma tend\u00eancia de 80% a trair.\n    \"\"\"\n    total_anos_p1 = 0\n    total_anos_p2 = 0\n\n    for _ in range(NUMERO_DE_RODADAS):\n        # Cada prisioneiro decide trair com 80% de probabilidade.\n        escolha_p1 = TRAIR if random.random() &lt; PROBABILIDADE_TRAIR else COOPERAR\n        escolha_p2 = TRAIR if random.random() &lt; PROBABILIDADE_TRAIR else COOPERAR\n\n        sentenca_p1, sentenca_p2 = dilema_do_prisioneiro(escolha_p1, escolha_p2)\n        total_anos_p1 += sentenca_p1\n        total_anos_p2 += sentenca_p2\n\n    return total_anos_p1, total_anos_p2\n\ndef simular_olho_por_olho_com_traicao():\n    # Simula \"Olho por Olho\" onde P1 tem 80% de chance de trair\n    total_anos_p1 = 0\n    total_anos_p2 = 0\n    jogada_anterior_p1 = COOPERAR\n    jogada_anterior_p2 = COOPERAR\n\n    for i in range(NUMERO_DE_RODADAS):\n        # P2 joga \"Olho por Olho\" puro\n        escolha_p2 = jogada_anterior_p1 if i &gt; 0 else COOPERAR\n\n        # L\u00f3gica de P1     \n        if i &gt; 0 and jogada_anterior_p1 == TRAIR: #se antes P1 traiu ele volta atr\u00e1s\n            escolha_p1 = COOPERAR\n        else:\n            # P1 n\u00e3o traiu, ent\u00e3o verifica a chance de trair agora\n            if random.random() &lt; PROBABILIDADE_TRAIR:\n                escolha_p1 = TRAIR\n            else:\n                escolha_p1 = COOPERAR\n        \n        sentenca_p1, sentenca_p2 = dilema_do_prisioneiro(escolha_p1, escolha_p2)\n        total_anos_p1 += sentenca_p1\n        total_anos_p2 += sentenca_p2\n        jogada_anterior_p1 = escolha_p1\n        jogada_anterior_p2 = escolha_p2\n        \n    return total_anos_p1, total_anos_p2\n\nif __name__ == \"__main__\":\n    # Cen\u00e1rio 1: Prisioneiros escolhendo de forma alet\u00f3ria\n    anos_p1_aleatorio, anos_p2_aleatorio = simular_cenario_aleatorio()\n    total_geral_aleatorio = anos_p1_aleatorio + anos_p2_aleatorio\n    print(\"--- Cen\u00e1rio 1: Prisioneiros Aleat\u00f3rios (80% de chance de trair) ---\")\n    print(f\"Total de anos para o Prisioneiro 1: {anos_p1_aleatorio}\")\n    print(f\"Total de anos para o Prisioneiro 2: {anos_p2_aleatorio}\")\n    print(f\"Total geral de anos de pris\u00e3o: {total_geral_aleatorio}\\n\")\n\n    # Cen\u00e1rio 2: \"Olho por Olho\" com Tend\u00eancia \u00e0 Trai\u00e7\u00e3o\n    anos_p1_mod, anos_p2_mod = simular_olho_por_olho_com_traicao()\n    total_geral_mod = anos_p1_mod + anos_p2_mod\n    print(\"--- Cen\u00e1rio 2: 'Olho por Olho' com 80% de Chance de Trair ---\")\n    print(f\"Total de anos para o Prisioneiro 1: {anos_p1_mod}\")\n    print(f\"Total de anos para o Prisioneiro 2: {anos_p2_mod}\")\n    print(f\"Total geral de anos de pris\u00e3o: {total_geral_mod}\\n\")\n<\/code><\/pre>\n\n\n\n<p>Ao rodar o c\u00f3digo, observe que o total de anos preso de cada prisioneiro \u00e9 sempre menor no segundo cen\u00e1rios. O resultado da execu\u00e7\u00e3o \u00e9 ilustrado abaixo. Se quiser fazer usas pr\u00f3prias execu\u00e7\u00f5es, acesse o <a href=\"https:\/\/py3.codeskulptor.org\/#user310_25NZwI8pYT_0.py\" target=\"_blank\" rel=\"noreferrer noopener\">c\u00f3digo aqui<\/a>.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code class=\"\">--- Cen\u00e1rio 1: Prisioneiros Aleat\u00f3rios (80% de chance de trair) ---\nTotal de anos para o Prisioneiro 1: 4816\nTotal de anos para o Prisioneiro 2: 4776\nTotal geral de anos de pris\u00e3o: 9592\n\n--- Cen\u00e1rio 2: 'Olho por Olho' com 80% de Chance de Trair ---\nTotal de anos para o Prisioneiro 1: 4552\nTotal de anos para o Prisioneiro 2: 4552\nTotal geral de anos de pris\u00e3o: 9104<\/code><\/pre>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Muitas vezes gera\u00e7\u00e3o de n\u00fameros aleat\u00f3rios \u00e9 explicada a partir de jogar uma moeda ou de um dado (eu mesmo j\u00e1 fiz isso aqui), embora seja interessante explicar com outras aplica\u00e7\u00f5es, como eu mesmo j\u00e1 fiz associando com o problema de Monty Hill. Dessa vez explico a aleatoriedade a partir da elabora\u00e7\u00e3o de uma simula\u00e7\u00e3o [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"footnotes":""},"categories":[5],"tags":[65],"class_list":["post-1444","post","type-post","status-publish","format-standard","hentry","category-python","tag-aleatoriedade"],"aioseo_notices":[],"amp_enabled":true,"_links":{"self":[{"href":"http:\/\/www.galirows.com.br\/meublog\/programacao\/wp-json\/wp\/v2\/posts\/1444","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/www.galirows.com.br\/meublog\/programacao\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.galirows.com.br\/meublog\/programacao\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.galirows.com.br\/meublog\/programacao\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/www.galirows.com.br\/meublog\/programacao\/wp-json\/wp\/v2\/comments?post=1444"}],"version-history":[{"count":2,"href":"http:\/\/www.galirows.com.br\/meublog\/programacao\/wp-json\/wp\/v2\/posts\/1444\/revisions"}],"predecessor-version":[{"id":1447,"href":"http:\/\/www.galirows.com.br\/meublog\/programacao\/wp-json\/wp\/v2\/posts\/1444\/revisions\/1447"}],"wp:attachment":[{"href":"http:\/\/www.galirows.com.br\/meublog\/programacao\/wp-json\/wp\/v2\/media?parent=1444"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.galirows.com.br\/meublog\/programacao\/wp-json\/wp\/v2\/categories?post=1444"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.galirows.com.br\/meublog\/programacao\/wp-json\/wp\/v2\/tags?post=1444"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}