{"id":1207,"date":"2021-09-11T15:06:24","date_gmt":"2021-09-11T18:06:24","guid":{"rendered":"http:\/\/www.galirows.com.br\/meublog\/programacao\/?p=1207"},"modified":"2021-09-11T15:08:45","modified_gmt":"2021-09-11T18:08:45","slug":"guia-definitivo-valores-aleatorios-c","status":"publish","type":"post","link":"https:\/\/www.galirows.com.br\/meublog\/programacao\/guia-definitivo-valores-aleatorios-c\/","title":{"rendered":"Guia definitivo para gerar valores aleat\u00f3rios em C"},"content":{"rendered":"\n<p>A gera\u00e7\u00e3o de n\u00fameros aleat\u00f3rios \u00e9 um problema comum em programa\u00e7\u00e3o, seja para testar mais rapidamente seus algoritmos, seja como parte real da solu\u00e7\u00e3o do problema (por exemplo, para simular um cara ou coroa.<\/p>\n\n\n\n<p>N\u00fameros aleat\u00f3rios (tamb\u00e9m chamados de rand\u00f4micos), s\u00e3o gerados na linguagem C a partir do uso da fun\u00e7\u00e3o <em>rand()<\/em>. Essa fun\u00e7\u00e3o pertence a biblioteca <em>stdlib.h<\/em>, sendo que essa biblioteca tamb\u00e9m possui a fun\u00e7\u00e3o <em>srand()<\/em> e a constante RAND_MAX, ambas comumente associadas com a fun\u00e7\u00e3o <em>rand()<\/em>.<\/p>\n\n\n\n<p>Quando a fun\u00e7\u00e3o <em>rand()<\/em> \u00e9 chamada ela produz um valor aleat\u00f3rio inteiro no intervalo de valores entre 0 e a constante RAND_MAX. A linha 5 do c\u00f3digo abaixo mostra o uso da fun\u00e7\u00e3o <em>rand()<\/em> e tamb\u00e9m da constante RAND_MAX. <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"c\" class=\"language-c line-numbers\">#include &lt;stdio.h>\n#include &lt;stdlib.h> \/\/necessario para rand()\n\t\nint main(void) {\n\tprintf(\"%i %i\\n\", rand(), RAND_MAX);\n\treturn 0;\n}<\/code><\/pre>\n\n\n\n<p>Se o c\u00f3digo for executado v\u00e1rias vezes \u00e9 poss\u00edvel perceber que o n\u00famero aleat\u00f3rio mostrado \u00e9 sempre o mesmo. Isso n\u00e3o \u00e9 um problema e sim uma caracter\u00edstica da linguagem C.<\/p>\n\n\n\n<p>Para que cada execu\u00e7\u00e3o do c\u00f3digo gere um novo conjunto de valores aleat\u00f3rios \u00e9 necess\u00e1rio &#8220;plantar uma nova semente&#8221; de valores aleat\u00f3rios. Isso \u00e9 feito utilizando a fun\u00e7\u00e3o <em>srand()<\/em> e passando paro par\u00e2metro para a fun\u00e7\u00e3o um valor para a semente. Esse valor normalmente \u00e9 fornecido pela fun\u00e7\u00e3o <em>time(NULL)<\/em>, que pertence a biblioteca <em>time.h<\/em>. A fun\u00e7\u00e3o <em>time()<\/em> se baseia no rel\u00f3gio do computador e retorna a quantidade de segundos passados desde 1 de janeiro de 1970. O c\u00f3digo a seguir adiciona o uso da fun\u00e7\u00e3o <em>srand()<\/em> para gerar um valor aleat\u00f3rio diferente em cada execu\u00e7\u00e3o do c\u00f3digo.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"c\" class=\"language-c line-numbers\">#include &lt;stdio.h>\n#include &lt;stdlib.h> \/\/necessario para rand() e srand()\n#include &lt;time.h>  \/\/necessario para time()\n\t\nint main(void) {\n\tsrand(time(NULL));\n\tprintf(\"%i %i\\n\", rand(), RAND_MAX);\n\treturn 0;\n}<\/code><\/pre>\n\n\n\n<p>Simplesmente gerar valores aleat\u00f3rios quaisquer \u00e9 pouco \u00fatil em uma aplica\u00e7\u00e3o real, por exemplo, se for necess\u00e1rio simular a jogada de um dado de seis faces, os valores aleat\u00f3rios deveriam estar no intervalo entre 1 e 6. Para isso \u00e9 necess\u00e1rio condicionar os valores aleat\u00f3rios para um intervalo e isso \u00e9 feito realizando c\u00e1lculos.<\/p>\n\n\n\n<p>A linha 6 do c\u00f3digo abaixo mostra como condicionar o valor aleat\u00f3rio para o intervalo entre 0 e 9. Isso porque qualquer n\u00famero divido por 10, o resto dessa divis\u00e3o ser\u00e1 um n\u00famero entre 0 e 9. Na linha 7 \u00e9 gerado um n\u00famero entre 1 e 6, simulando um dado de 6 faces. Perceba que o resultado da divis\u00e3o de um n\u00famero por 6 sempre resultar\u00e1 um n\u00famero entre zero (menor valor poss\u00edvel) e 5 (maior valor poss\u00edvel). Quando \u00e9 adicionado o valor 1 ao resultado, o menor valor poss\u00edvel passa a ser o valor 1, enquanto o maior valor poss\u00edvel passa a ser o valor 6, gerando valores no intervalo entre 1 e 6.<\/p>\n\n\n\n<p>Mesmo que a fun\u00e7\u00e3o <em>rand()<\/em> gere apenas valores positivos, \u00e9 poss\u00edvel obter valores negativos. Na linha 8 o valor \u00e9 condicionado para ser um valor no intervalo entre -10 e 0. O resto da divis\u00e3o de um n\u00famero por 11 ser\u00e1 um valor entre 0 e 10 e, subtraindo 10 desse resultado, \u00e9 obtido como menor valor poss\u00edvel o valor -10 e como maior valor poss\u00edvel o valor 0. Na linha 9 o racioc\u00ednio \u00e9 aplicado para gerar valores no intervalo entre -10 e 10.<\/p>\n\n\n\n<p>Mesmo que a constante RAND_MAX limite os valores ao intervalo entre 0 e 32767, valores maiores do que esse limite m\u00e1ximo tamb\u00e9m podem ser gerados sem precisar alterar o valor da constante na biblioteca <em>stdlib.h<\/em>. Para isso basta elaborar o c\u00e1lculo apropriado. Na linha 10 \u00e9 gerado um valor aleat\u00f3rio entre 0 e 65534 a partir da soma de dois n\u00fameros aleat\u00f3rios. <\/p>\n\n\n\n<p>Mesmo que a fun\u00e7\u00e3o <em>rand()<\/em> apenas retorne valores inteiros, \u00e9 poss\u00edvel utiliz\u00e1-la para valores reais. Na linha 11 \u00e9 gerado um n\u00famero aleat\u00f3rio <em>float<\/em> entre 0 e 10 e com duas casas de precis\u00e3o decimal. O resto da divis\u00e3o de um n\u00famero por 1000 \u00e9 um valor entre 0 e 999, sendo que zero dividido por 100 continua sendo zero e 999 divido por 100 \u00e9 9,990000. \u00c9 importante ressaltar que a fun\u00e7\u00e3o \\textit{rand()} retorna um valor inteiro e que a opera\u00e7\u00e3o de resto de divis\u00e3o tamb\u00e9m obt\u00e9m um valor inteiro. Com isso o numerador \u00e9 um n\u00famero inteiro e por isso a divis\u00e3o \u00e9 feita por 100.0 (n\u00famero inteiro divido por outro n\u00famero inteiro resultar\u00e1 apenas na parte inteira da divis\u00e3o).<\/p>\n\n\n\n<p>Na linha 12 \u00e9 limitado os valores aleat\u00f3rios ao intervalo dos n\u00fameros reais entre 0 e 1. Uma vez que o valor m\u00e1ximo que pode ser gerado pela fun\u00e7\u00e3o <em>rand()<\/em> \u00e9 dado pela constate RAND_MAX, essa constante ser\u00e1 necess\u00e1ria no c\u00e1lculo. Como o menor valor gerado \u00e9 0, a divis\u00e3o de 0 \/ RAND_MAX \u00e9 0 (menor valor poss\u00edvel). Como o maior valor gerado \u00e9 RAND_MAX, o resultado da divis\u00e3o de RAND_MAX \/ RAND_MAX \u00e9 1 (maior valor poss\u00edvel). A divis\u00e3o de qualquer outro valor de <em>rand()<\/em> por RAND_MAX ser\u00e1 um valor <em>float<\/em> dentro do intervalo entre 0 e 1. Observe que a constante RAND_MAX \u00e9 um valor inteiro e por isso \u00e9 feito um <em>cast<\/em> para transformar esse valor em seu correspondente <em>float<\/em>.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"c\" class=\"language-c line-numbers\">#include &lt;stdio.h>\n#include &lt;stdlib.h>\n\nint main(void) {\n\tprintf(\"%i %i\\n\", rand(), RAND_MAX);\n\tprintf(\"%i\\n\", rand()%10);\n\tprintf(\"%i\\n\", rand()%6+1);\n\tprintf(\"%i\\n\", rand()%11-10);\n\tprintf(\"%i\\n\", rand()%21-10);\n\tprintf(\"%i\\n\", rand() + rand());\n\tprintf(\"%f\\n\", rand()%1000\/100.0);\n\tprintf(\"%f\\n\", rand()\/(float)RAND_MAX);\n\treturn 0;\n}<\/code><\/pre>\n\n\n\n<p>Por fim, qualquer outra necessidade de condicionamento \u00e9 uma varia\u00e7\u00e3o das formas aqui mostradas. \u00c9 importante ter em mente que o condicionamento \u00e9 um c\u00e1lculo aplicado a um valor inteiro positivo e limitado a um determinado valor. Levando em considera\u00e7\u00e3o essa limita\u00e7\u00e3o ao seu c\u00e1lculo, \u00e9 poss\u00edvel encontrar uma equa\u00e7\u00e3o que condicione o valor dentro de intervalos necess\u00e1rios.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>A gera\u00e7\u00e3o de n\u00fameros aleat\u00f3rios \u00e9 um problema comum em programa\u00e7\u00e3o, seja para testar mais rapidamente seus algoritmos, seja como parte real da solu\u00e7\u00e3o do problema (por exemplo, para simular um cara ou coroa. N\u00fameros aleat\u00f3rios (tamb\u00e9m chamados de rand\u00f4micos), s\u00e3o gerados na linguagem C a partir do uso da fun\u00e7\u00e3o rand(). Essa fun\u00e7\u00e3o pertence [&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":[3,58],"tags":[65,66],"class_list":["post-1207","post","type-post","status-publish","format-standard","hentry","category-c","category-codigo-com-analise","tag-aleatoriedade","tag-teoria"],"aioseo_notices":[],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/www.galirows.com.br\/meublog\/programacao\/wp-json\/wp\/v2\/posts\/1207","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.galirows.com.br\/meublog\/programacao\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.galirows.com.br\/meublog\/programacao\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.galirows.com.br\/meublog\/programacao\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.galirows.com.br\/meublog\/programacao\/wp-json\/wp\/v2\/comments?post=1207"}],"version-history":[{"count":4,"href":"https:\/\/www.galirows.com.br\/meublog\/programacao\/wp-json\/wp\/v2\/posts\/1207\/revisions"}],"predecessor-version":[{"id":1211,"href":"https:\/\/www.galirows.com.br\/meublog\/programacao\/wp-json\/wp\/v2\/posts\/1207\/revisions\/1211"}],"wp:attachment":[{"href":"https:\/\/www.galirows.com.br\/meublog\/programacao\/wp-json\/wp\/v2\/media?parent=1207"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.galirows.com.br\/meublog\/programacao\/wp-json\/wp\/v2\/categories?post=1207"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.galirows.com.br\/meublog\/programacao\/wp-json\/wp\/v2\/tags?post=1207"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}