Is there any way I can change the range of the rand function in the middle of the C code?

0

Hello, I was solving a college question about a "game" where you should think of a number and the machine should try to hit your number. I was able to do this work by creating a "formula" for it to find the value that the user thinks, but I would like the program to be a little more random, with no need for formulas. So the question is: is there any possibility of changing the rand interval in the middle of the code? For each time it "kicks" a value, the range decreases and it increases your chances of hitting the number.

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

int main(void){

setlocale(LC_ALL,"");
int t, in=0, f=100, cont=1, c;
char a[10];
printf("------------------------------Bem vindo(a) ao jogo de adivinhar um número!!!-----------------------\n\n");
printf("Funciona assim: você deve pensar em um número de 1 a 100 e eu vou tentar adivinhar seu número.\n");
printf("Eu vou dizer meu palpite e você responde se ele é maior ou menor que o número que você está pensando.\n");
printf("Você deve me dizer se eu acertei o número ou se o número que eu disse é maior ou menor que o número que você pensou.\n");
printf("Para vencer, eu devo acertar exatamente o número que você pensou.\n");
printf("Vamos começar? Pense num número para eu adivinhar.\n");
printf("\n\nQuando tiver terminado de pensar, digite 1 para continuar com o jogo: ");
scanf("%i", &c);
if(c==1){
while(1){
    srand( (unsigned)time(NULL) );
    t = in+ (rand () % f);
    if(cont==1){
        t=f/2;
    }else if(cont>1 && (f/2)>in){
        t=f/2;
    }printf("Seu número é %i, estou certo?\n", t);
    printf("Se acertei, digite (acertou), se não, digite se seu número é (maior) ou (menor) que meu número: ");
    fflush(stdin);
    gets(a);
    if(strcmp(a, "acertou")==0){
        printf("\n\n\nSou muito bom, não? Já acertei seu número!!\n\n\n");
        break;
    }else if(strcmp(a, "maior")==0){
        f = f + in;
        in = t;
        f = f-in;
        in++;
        printf("\n\nSeu número é maior do que o que eu disse? Ok, vou tentar novamente! \n\n\n");

    }else if(strcmp(a, "menor")==0){
        f = t - in;
        if(f>1){
            f--;
        }printf("\n\nSeu número é menor do que o que eu disse? Ok, vou tentar novamente! \n\n\n");

    }
    cont++;
}
}else{
    printf("\n\nDígito inválido! Da próxima vez digite 1 para continuar com o jogo!\n\n");
}
return 0;
}
    
asked by anonymous 15.05.2016 / 01:14

2 answers

0

Change srand() out of cycle.

Changes the instruction that has rand() to consider minimum and maximum values, using, for example, minval and maxval to calculate the intermediate number (use rand() to find the number the user selected is efficient)

int minval = 1;
int maxval = 100;

    // dentro do ciclo
    t = (maxval - minval + 1) / 2 + minval;

Each time you get a response "menor" or "maior" changes one of the values

    if (strcmp(a, "maior") == 0) {
        minval = t + 1;
    }
    if (strcmp(a, "menor") == 0) {
        maxval = t - 1;
    }

For example to guess the number 61 the sequence of variables would look like this:

                                                         |   novos
minval | maxval |  t | calculo                   | res   | min | max
-------+--------+----+---------------------------+-------+-----+-----
    1  |   100  | 51 | (100 - 1 + 1) / 2 + 1     | maior |  52 | 100
   52  |   100  | 76 | (100 - 52 + 1) / 2 + 52   | menor |  52 |  75
   52  |    75  | 64 | (75 - 52 + 1) / 2 + 52    | menor |  52 |  63
   52  |    63  | 58 | (63 - 52 + 1) / 2 + 52    | maior |  59 |  63
   59  |    63  | 61 | (63 - 59 + 1) / 2 + 59    | acertou 
    
16.05.2016 / 11:42
1

The only "wrong" thing in the code is that it generates a new seed every time. This is not ideal, but may work depending on the case. see the example with the seed out and generating numbers from 0 to 100. Even if you leave the seed generation inside the loop it would not be a problem in your case because you used the time based and there will always be a time interval between one and the other. / p>

See working on ideone .

Otherwise, consider the comments above.

    
15.05.2016 / 01:51