Números aleatórios no intervalo esperado

Números aleatórios no intervalo esperado

por Fernanda de Camargo Magano -
Número de respostas: 6

Oi galera!

Na parte II do EP  foi pedido para gerar os números aleatórios num determinado intervalo, dependendo do nível de dificuldade escolhido pelo jogador.  Esse número é gerado pela função RandomInteger. Mas ao compilar e testar o meu programa, os números de tapinhas gerados sempre ficam um pouco abaixo da porcentagem esperada. Por exemplo, no nível médio dá por volta de 22% a 26%, ou seja, sempre porcentagens um pouco menores que a esperada ou mal distribuídas. Alguém conseguiu obter uma distribuição melhor sem modificar a função?

Em resposta à Fernanda de Camargo Magano

Re: Números aleatórios no intervalo esperado

por Leonardo Pereira Macedo -

    Estou com essa mesma dúvida. perplexo
    O problema é que o nº de tapinhas sorteados pela função RandomInteger está ligado ao tamanho da semente.
    Por exemplo, para n = 6, o nº mínimo e máximo de tapinhas na dificuldade média são 9 e 18, respectivamente. Colocando 5 como semente obtive 9 tapinhas na RandomInteger. Já a semente 9001 gerou 17 tapinhas!
   É aceitável alterar o valor da semente digitada pelo usuário com alguma função auxiliar? Pois o jogador pode facilmente manipular o número de tapinhas usando essa ideia, o que quebra a ideia de aleatoriedade...

Em resposta à Fernanda de Camargo Magano

Re: Números aleatórios no intervalo esperado

por José Coelho de Pina -

Ois,

No primeiro semestre você fizeram um EP para testar um gerador de números aleatórios.
Não dava para fazer os mesmos teste com o randomInteger da página Números aleatórios de Paulo Feofiloff?

Bem,a semente digitada pelo usuário é apenas algo para testar
o programa. Se eu executar o meu programa e durante a execução
ocorrer algum erro poderia reproduzir o teste. Se não fosse pela fase
de teste seria razoável iniciar a semente como sugere a página do Paulo Feofiloff:

#include 

// A função Randomize inicializa o gerador de números 
// aleatórios de modo que os resultados das
// invocações de RandomInteger seja imprevisível.

void Randomize(void)
{
    srand(time(NULL));
}

Na página há ainda o comentário:

"...A qualidade dos números produzidos pela função não é boa se a diferença high − low for grande, especialmente se high − low for maior que RAND_MAX."

P.S. Na página do EP1 eu coloquei um link para uma página onde está há uma explicação
simplificada sobre geradores de números (pseudo-)aleatórios.

Em resposta à Fernanda de Camargo Magano

Re: Números aleatórios no intervalo esperado

por José Coelho de Pina -

Salve,

Fiquei com a pulga atrás da orelha e acabei fazendo um programa para testar um pouco a função randomInteger.
Abaixo estão alguns resultados do programa, o que você vêem em vermelho fui eu que digitei.
Vou deixar esse programa junto com o esqueleto do EP1 para vocês brincarem à vontade.
Vejam se vocês decobrem algo.

P.S. No final da próxima aula, sem falta, eu falo sobre essa leitura de parâmetro através da linha de comando.


meu_prompt> ./randomInteger 
Programa para testar a função randInteger(low,high)
randomInteger: uso: randomInteger [-s<numero> |-n<numero> ]
    -n<numero> ordem da matriz de tapinhas
    -r<numero> numero de experimentos
    Exemplo de uso: randomInteger -s9001 -n6


meu_promp> ./randomInteger -n6 -r10
Programa para testar a função randInteger(low,high)
RAND_MAX = 2147483647
INT_MAX  = 2147483647
n = 6
r = 10
Intervalo nivel facil  : de 1 a 7
Intervalo nivel medio  : de 9 a 18
Intervalo nivel dificil: de 19 a 30

Digite uma semente: 5
  semente =          5
  facil   =          2
  medio   =         11
  dificil =         22

Digite uma semente: 9001
  semente =       9001
  facil   =          6
  medio   =         16
  dificil =         28

Digite uma semente: 9002
  semente =       9002
  facil   =          1
  medio   =         10
  dificil =         20

Digite uma semente: 9003
  semente =       9003
  facil   =          7
  medio   =         18
  dificil =         30

Digite uma semente: 2
  semente =          2
  facil   =          5
  medio   =         16
  dificil =         27

Digite uma semente: 3
  semente =          3
  facil   =          4
  medio   =         14
  dificil =         25

Digite uma semente: 4
  semente =          4
  facil   =          7
  medio   =         18
  dificil =         29

Digite uma semente: 31415
  semente =      31415
  facil   =          4
  medio   =         13
  dificil =         24

Digite uma semente: 31415926
  semente =   31415926
  facil   =          4
  medio   =         13
  dificil =         24

Digite uma semente: 31415927
  semente =   31415927
  facil   =          3
  medio   =         12
  dificil =         23
Em resposta à José Coelho de Pina

Re: Números aleatórios no intervalo esperado

por Fernanda de Camargo Magano -

Obrigada pela atenção, professor!

Vou testar o programa com essas sementes que você usou!  =D

Em resposta à Fernanda de Camargo Magano

Re: Números aleatórios no intervalo esperado

por Thiago Gomes -

Professor, posso usar time como seed ao invés de pedir pro usuário?

Em resposta à Thiago Gomes

Re: Números aleatórios no intervalo esperado

por José Coelho de Pina -

Oi Thiago

Professor, posso usar time como seed ao invés de pedir pro usuário?

Você deve usar time para brincar brincar com o programa, mas o EP entregue deve seguir as especificações do enunciado, ou seja, deve ler a semente.