Rand () всегда дает одно и то же число в C

Я новичок в C, и я делаю простой код для получения случайного числа. Я пытался сделать игру более или менее (случайное число, и игрок пишет число), но когда я запускаю код в терминале, я всегда получаю одно и то же число. Это нормально? А если нет, как это исправить?

#include <stdio.h>
#include <stdlib.h>
int main() {
    int essais = 10;
    int secret;
    int number;
    int win = 0;
    secret = rand()%100;
    while (essais > 0 && win != 1){
        printf("Quel est le nombre secret ? \n");
        scanf("%d",&number);
        if (number == secret){
            printf("Gagné !\n");
            win++;
        }
        else if (number < secret) {
            printf("Non c'est plus :/\n");
            essais--;
            printf("Il vous reste %d essais\n",essais);
        }
        else{
            printf("Non c'est moins :/\n");
            essais--;
            printf("Il vous reste %d essais\n",essais);
        }
        if (essais == 0)
            printf("Vous n'avez plus d'essais :(, vous aurez plus de chance la prochaine fois. Le nombre était %d",secret);
    }
}

PS: Извините, я француз, поэтому я написал код и сообщения на французском языке, но проблема не здесь

# random
Источник
  • 4
    Вы должны заполнить его один раз , например, srand(time(NULL)); В противном случае вы будете каждый раз получать одну и ту же (неслучайную) последовательность, что полезно только при отладке.
  • 0
    Если вы не вызываете srand() , это эквивалентно srand(1) .
Codelisting
за 1 против

В первую очередь вам не хватает семян, как сказано в другом ответе без этогоrand() будет генерировать одно и то же число каждый раз.

srand();

Во-вторых, конечно, он даст вам тот же номер, когда вы генерируете случайное число только один раз.

secret = rand()%100;

копироватьsecret = rand()%100; где-то внутри цикла, и вы получите случайные числа, но вам нужно будет иметь семя перед циклом.

Следовательно, попробуйте это:

#include <stdio.h>
#include <stdlib.h>
int main() {
    srand(time(NULL));

    int essais = 10;
    int secret;
    int number;
    int win = 0;
    secret = rand()%100;

    while (essais > 0 && win != 1){
        printf("Quel est le nombre secret ? \n");
        scanf("%d",&number);
        if (number == secret){
            printf("Gagné !\n");
            
            win++;
        }
        else if (number < secret) {
            printf("Non c'est plus :/\n");
            essais--;
            printf("Il vous reste %d essais\n",essais);
        }
        else{
            printf("Non c'est moins :/\n");
            essais--;
            printf("Il vous reste %d essais\n",essais);
        }
        if (essais == 0)
            printf("Vous n'avez plus d'essais :(, vous aurez plus de chance la prochaine fois. Le nombre était %d",secret);
    }
}

Еще кое-что для вас, bitte, s'il te plaît, я не знаю вашего языка, поэтому, пожалуйста, ставьте комментарии рядом с переменными иprintf заявления.

  • 0
    Получение нового случайного числа бесполезно, поскольку основной цикл завершается, если win == 1
  • 0
    @chqrlie, вы правы :( У меня плохо. Значит, это была всего лишь проблема с семенами, чем :(
за 1 против

Да, rand () сам по себе повторяет сгенерированные числа, поэтому вам нужно использовать это:

srand(time(0));  //use this line only once

//and then after that use the rand() function again

//You will also need to include time.h library above
  • 0
    это одна из его проблем. :) Молодец!!!
за 0 против

Большое спасибо ! Это действительно помогло мне :) Еще раз спасибо. Я, конечно, переведу то, что сказал, но основное

#include <stdio.h>
#include <stdlib.h>
int main() {
    srand(time(NULL));

    int essais = 10; // tries
    int secret;
    int number;
    int win = 0;
    secret = rand()%100;

    while (essais > 0 && win != 1){
        printf("Quel est le nombre secret ? \n"); // what is the secret number ?
        scanf("%d",&number);
        if (number == secret){
            printf("Gagné !\n"); // won
            secret = rand()%100;
            win++;
        }
        else if (number < secret) {
            printf("Non c'est plus :/\n"); // No, that's more
            essais--;
            printf("Il vous reste %d essais\n",essais); // You have ... tries left
        }
        else{
            printf("Non c'est moins :/\n"); // No that's less
            essais--;
            printf("Il vous reste %d essais\n",essais);
        }
        if (essais == 0)
            printf("Vous n'avez plus d'essais :(, vous aurez plus de chance la prochaine fois. Le nombre était %d",secret); // You don't have tries anymore, better luck next time
    }
}
  • 1
    Вы также должны #include <time.h> для правильного прототипа функции time() .
  • 0
    да, но я думаю, что это работает и без времени. h: b
  • 1
    time() принимает указатель на time_t и возвращает значение time_t Без правильного прототипа в области видимости (без #include ) компилятор будет предполагать, что и возвращаемое значение, и аргументы имеют тип int . int не взаимозаменяем с time_t или time_t* . То, что программа «работает», - всего лишь неудачное проявление Undefined Behavior .
Codelisting
Популярные категории
На заметку программисту