【问题标题】:Rand() always give the same number in C [duplicate]Rand() 在 C 中总是给出相同的数字 [重复]
【发布时间】:2021-05-31 18:00:44
【问题描述】:

我是 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:对不起,我是法国人,所以我用法语编写了代码和消息,但问题不在这里

【问题讨论】:

  • 您必须为它播种 一次,例如 srand(time(NULL)); 否则您每次都会得到相同的(非随机)序列,这仅在调试时有用。跨度>
  • 如果不调用srand(),则相当于srand(1)

标签: c random


【解决方案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,我不懂你的语言,所以请将 cmets 放在变量和 printf 语句旁边。

【讨论】:

  • 获取一个新的随机数是没有用的,因为如果win == 1,主循环就会退出
  • @chqrlie 你是对的 :( 我的错。所以这只是种子问题而不是 :(
【解决方案2】:

是的,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

【讨论】:

    【解决方案3】:

    非常感谢! 这真的帮助了我:) 所以再次感谢。 当然,我会翻译我所说的,但它是基本的

    #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
        }
    }
    

    【讨论】:

    • 您还应该#include &lt;time.h&gt; 获得time() 函数的正确原型。
    • 是的,但我认为它也可以在没有 time.h 的情况下工作:b
    • time() 接受一个指向time_t 对象的指针并返回一个time_t 值。如果范围内没有正确的原型(没有#include),编译器将假定返回值和参数都是int 类型。 int 不能与 time_ttime_t* 互换。程序“工作”的事实只是 Undefined Behaviour 的不幸表现。
    猜你喜欢
    • 2011-06-19
    • 1970-01-01
    • 2013-03-11
    • 2011-03-31
    • 1970-01-01
    • 2017-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多