Jump to content

[Resolvido] Gerar matriz de carcteres aleatorio


Recommended Posts

Posted (edited)

eu fiz este ciclo para me imprimir os caracteres de 'A' a 'Z' segundo o código ASCII deles:

void gerar_matriz(char matriz[MAX][MAX]){
   for (int i=65; i<=90; i++) {
       for (int j=65; j<=90; j++) {
           matriz[i][j]=rand();
       }
   }
   for (int i=65; i<=90; i++) {
       for (int j=65; j<=90; j++) {
           printf("%c",matriz[i][j]);
       }
   }
}

mas imprime isto :

\247\361\331*\202\310\330\376CM\230U\214\342\263G\230T/-X\365kֈ\231\222H3bA\363

#\345_0\321\310\355aK59\201\204\270\242\234\264Zg*\312\345H\351\305\361\260\304\212\345\233M9\366\367\350\241\323\376\355\245\325\363\331\344[\372l\303Q\342 \256\341\230ma\3774\241\3756P鷁\217\303:\300,DUzȫPɲ޲\366\265\342LOݟ\210g\275\316\362a鱷

Edited by pmg
falta LP
Posted (edited)

O que o teu programa esta a imprimir é o resultado da funcao rand().

Se queres imprimir valores especificos, nao uses rand(); usa rand() apenas para obteres valores aleatorios.

Para gerar um valor aleatorio entre os valores "LO" e "HI" (inclusive), usa o codigo

int randbetween(int lo, int hi) {
   if (lo > hi) { int tmp = lo; lo = hi; hi = tmp; }
   return (rand() % (hi - lo + 1)) + lo; /* ATTENTION: MAY CONTAIN BIAS */
}
Edited by pmg
  • Vote 1

What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Posted

eu tinha esse ciclo entre 65 e 90 como uma tentativa de limitar o rand() a esses valor só depois de analisar bem é que vi que é muito estupido 😛

a função que pmg me recomendou funciona lindamente, só não percebo bem o calculo.

Podem-me dar um explicaçãozinha sobre o calculo? 😕

Obrigado a todos pela ajuda 😛

Posted (edited)
int rand ( void );

Generate random number

Returns a pseudo-random integral number in the range between 0 and RAND_MAX.

O valor de RAND_MAX: "This value is library-dependent, but is guaranteed to be at least 32767 on any standard library implementation."

X = Numero % mod;

Qualquer que seja o Numero, o valor de X estara entre 0 e mod-1 (com mod > 0), e' o resto da divisao.

http://www.cplusplus.com/reference/clibrary/cstdlib/rand/

http://www.cplusplus.com/reference/clibrary/cstdlib/RAND_MAX/

Edited by mogers

"What we do for ourselves dies with us. What we do for others and the world, remains and is immortal.", Albert Pine

Blog pessoal : contém alguns puzzles, algoritmos e problemas para se resolver com programação.

Posted (edited)

A função rand() devolve um número entre 0 e RAND_MAX.

Nós queremos reduzir esse intervalo a um intervalo mais pequeno (por exemplo, entre 15 e 21).

Para isso é bom saber quantos números existem para o intervalo em que estamos interessados (15, 16, 17, 18, 19, 20, 21: ou seja 7 números). Para calcular esse número de números calcula-se a subtracção do maior pelo menor e soma-se 1 (21 - 15 + 1; outro exemplo: entre 165 e 165: 165 - 165 + 1 => há um número).

Sabendo quantos números queremos podemos calcular o resto da divisão (rand() % <NUMERO_DE_NUMEROS>). Isto vai dar um número aleatório (com bias) entre 0 e um menos o <NUMERO_DE_NUMEROS>.

Se a seguir somarmos o número mais pequeno a esse resultado obtemos o pretendido 🙂

Exemplo detalhado: randbetween(15, 21)

rand() deu 64100825

21 - 15 + 1 dá 7

64100825 % 7 dá 5 (o resto da divisão de 64100825 por 7 dá 5)

5 + 15 dá 20

resultado 20

Edited by pmg

What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Posted

bias

Suponhamos que a função rand() dá números entre 0 e 50 e que pretendemos obter números aleatórios entre 1 e 40.

Com a função sugerida por mim,

quando o número aleatório for 0 ou 40 (depois do módulo e soma de 1) obtemos 1

quando o número aleatório for 1 ou 41 (depois do módulo e soma de 1) obtemos 2

...

quando o número aleatório for 9 ou 49 (depois do módulo e soma de 1) obtemos 10

quando o número aleatório for 10 ou 50 (depois do módulo e soma de 1) obtemos 11

quando o número aleatório for 11 (depois do módulo e soma de 1) obtemos 12

quando o número aleatório for 12 (depois do módulo e soma de 1) obtemos 13

...

quando o número aleatório for 38 (depois do módulo e soma de 1) obtemos 39

quando o número aleatório for 39 (depois do módulo e soma de 1) obtemos 40

Como se pode constatar há muito mais probabilidade de obter 1, 2, ..., 11 do que os outros números.

é isto o bias

Como o RAND_MAX é um número muito grande e o <NUMERO_DE_NUMEROS> é muito pequeno, o bias é pequenino (e muitas vezes escolhe-se ignorar)

What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.