Ir ao conteúdo

numeros aleatorios


Cambalinho

Posts recomendados

Postado

int RandomNumber(int min, int max)
{
int a;
srand (time(NULL));
a= rand()%max;
return a;
}

esta funçao nao esta a funcionar:(

porque da-me numeros superiores a max. alguem me pode explicar o que esta mal?

como posso alerar o codigo para poder me dar numeros aleatorios entre 2 numeros?

Postado

Montei um exemplo com a sua função, e retornou corretamente os valores.


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

void RandomNumber(int max)
{
int a;

srand (time(NULL));

a = rand() % max;

printf("Rand: %d\n", a);

}

int main(void)
{

RandomNumber(10);
RandomNumber(100);
RandomNumber(1000);

return 0;
}

Saída:


Rand: 8
Rand: 68
Rand: 468

Postado
Montei um exemplo com a sua função, e retornou corretamente os valores.


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

void RandomNumber(int max)
{
int a;

srand (time(NULL));

a = rand() % max;

printf("Rand: %d\n", a);

}

int main(void)
{

RandomNumber(10);
RandomNumber(100);
RandomNumber(1000);

return 0;
}

Saída:


Rand: 8
Rand: 68
Rand: 468

eis com a uso:

sprintf(v,"F/S: %3.0d.... max: %2.0d   Points: %d  Numero: %d",FrameCount, max,intPoints, RandomNumber(0,20) );
g=strlen(v);

gotoxy(0,24);
printf("%s",v);

e estou dentro de 1 ciclo. e parece que o numero vai aumentando. ate ja me mostrou 88:(

Postado
Colega Cambalinho, estranho isso.

Estás usando qual sistema operacional e compilador?

windows 7 com o Visual C++ 6.

desculpa mas para mim nao é assim estranho. porque eu tenho sempre dificuldade em encontrar algum codigo correcto, porque existem varias versões de C\C++ e isso é que é o problema... eis o novo codigo que tenho e diz-me o que pensas:

int RandomNumber( int low, int high)
{
int k;
double d;
d = (double) rand( ) / ((double) RAND_MAX + 1);
k = d * (high - low + 1);
return low + k;
}

eu nao sei como funciona e nem sei o valor de RAND_MAX. mas 1 coisa é certa: o 1º algarismo nao subiu de 2... ou seja nao consegui ver valores superiores a 20;)

mas diz-me o que pensas deste codigo.

Postado

Parece que a limitação do "rand()" é da biblioteca do visual 6.

Pelo que entendi (link), a função "rand()" dessa biblioteca não comporta limitação de valores como no exemplo que postei. Sempre comparará com o o valor definido em RAND_MAX (0x7fff, que é 32767 em decimal).

A sua função faz todo sentido com o que eu disse.

Se o valor máximo de "rand()" é o valor de RAND_MAX, o resultado da divisão seria 1. Como você adicionou "+1" pra RAND_MAX, logo, o resultado da divisão será sempre inferior a 1, chegando no máximo, proximo desse valor.

Vamos fazer o cálculo de como ficaria o resultado, imaginando que a função "rand()" tenha retornado o valor mais alto (32.767) e os parametros tenham sido, 20 e 100, respectivamente.

O resultado seria esse:


O resultado de "d = (double) rand( ) / ((double) RAND_MAX + 1)" seria:
d = 32767 / 32768 = 0,99

Logo, o resultado de "k = d * (high - low + 1)":
k = 0,99 * (100 - 20 + 1) = 0,99 * 81 = 80,19

Como a função retorna apenas a parte inteira, o máximo seria o valor 80. ;)

Agora, por curiosidade, você poderia testar a função anterior, porém, sem o "%max"


int RandomNumber(int mim, int max)
{
int a;
srand (time(NULL));
a= rand();
return a;
}

e definir


#define RAND_MAX 80

O "#define" é definido logo após os "#include".

Veja se funciona.

Se funcionar, realmente matamos a charada. :cool:

Postado
Parece que a limitação do "rand()" é da biblioteca do visual 6.

Pelo que entendi (link), a função "rand()" dessa biblioteca não comporta limitação de valores como no exemplo que postei. Sempre comparará com o o valor definido em RAND_MAX (0x7fff, que é 32767 em decimal).

A sua função faz todo sentido com o que eu disse.

Se o valor máximo de "rand()" é o valor de RAND_MAX, o resultado da divisão seria 1. Como você adicionou "+1" pra RAND_MAX, logo, o resultado da divisão será sempre inferior a 1, chegando no máximo, proximo desse valor.

Vamos fazer o cálculo de como ficaria o resultado, imaginando que a função "rand()" tenha retornado o valor mais alto (32.767) e os parametros tenham sido, 20 e 100, respectivamente.

O resultado seria esse:


O resultado de "d = (double) rand( ) / ((double) RAND_MAX + 1)" seria:
d = 32767 / 32768 = 0,99

Logo, o resultado de "k = d * (high - low + 1)":
k = 0,99 * (100 - 20 + 1) = 0,99 * 81 = 80,19

Como a função retorna apenas a parte inteira, o máximo seria o valor 80. ;)

Agora, por curiosidade, você poderia testar a função anterior, porém, sem o "%max"


int RandomNumber(int mim, int max)
{
int a;
srand (time(NULL));
a= rand();
return a;
}

e definir


#define RAND_MAX 80

O "#define" é definido logo após os "#include".

Veja se funciona.

Se funcionar, realmente matamos a charada. :cool:

da-me numeros enormes com 5 ou 6 algarismos lol

Postado

Cambalinho,

Dê uma olhada, eu tomei por base a sua mensagem #8. Veja se funciona por aí.

#include <stdio.h>
#include <stdlib.h>
#include <time.h>


int RandomNumber(int low, int high)
{
int a;

a = low + (int)((high - low + 1) * ((double)rand() / (RAND_MAX + 1.0)));

return a;
}


int main (void) {


int i;

srand ((unsigned)time( NULL ));

for ( i = 0; i < 20; i++ ) {

printf("%d\n", RandomNumber(1, 20));

}


return 0;
}

Abs.

LNW

Postado
Cambalinho,

Dê uma olhada, eu tomei por base a sua mensagem #8. Veja se funciona por aí.

#include <stdio.h>
#include <stdlib.h>
#include <time.h>


int RandomNumber(int low, int high)
{
int a;

a = low + (int)((high - low + 1) * ((double)rand() / (RAND_MAX + 1.0)));

return a;
}


int main (void) {


int i;

srand ((unsigned)time( NULL ));

for ( i = 0; i < 20; i++ ) {

printf("%d\n", RandomNumber(1, 20));

}


return 0;
}

Abs.

LNW

retirei o RAND_MAX do #define e deu. thanks

  • Moderador
Postado

Caso o autor do tópico necessite, o mesmo será reaberto, para isso deverá entrar em contato com a moderação solicitando o desbloqueio.

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!