-4

我正在尝试使用该rand()函数生成伪随机整数。它有效,但我的问题是它总是为int“选择”相同的名称。(在这种情况下,它是 41。我认为如果你把它放在rand()main 的 while 循环中,它是 85 或其他东西。)

有没有办法解决这个问题?这是我的代码:

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

    int guess;
    int danse = rand() % 101;

    using namespace std;

    void more(){
    cout << "The number that you need to guess is higher!";

    return;
    }

    void lower(){
    cout << "The number that you need to guess is lower!";

    return;
    }

    int main(){
    while(1){
    cout << "\nGuess a number 0-100: ";
    cin >> guess;

    if (guess > danse){
        lower();
}
    if (guess < danse){
        more();
}

    if (guess == 101){
        break;
}

    if (guess == danse){
        cout << "\nYOU GUESSED IT. ARE YOU A WIZARD?! BECAUSE THAT IS PRETTY NEAT.";
        break;
}
    }
    }

只是一些旁注:请不要试图告诉我我已经知道的事情,比如解释我为什么使用带返回的 void 函数。也请不要试图说服我 using namespace std; 是“坏”的做法。我知道还有其他方法可以做到这一点。我选择不这样做。

谢谢!

4

3 回答 3

5

您需要在使用srand之前调用一次随机数生成器来播种rand。当前时间是选择在程序运行之间变化的种子的一种廉价且简单的方法。

int danse;

int main(){
    srand(time(NULL));
    danse = rand() % 101;
于 2013-08-16T18:16:09.130 回答
2

rand()生成一个伪随机序列,从给定的种子开始。对于任何指定的种子,以下所有值都将相同。默认情况下,种子为 1。

为了在每次运行程序时获得不同的值,您需要在生成器(使用srand())中植入从用户的角度来看似乎是随机的东西。Unix 机器上的最佳解决方案是从中读取足够的字节 "/dev/random"来创建一个int,并使用它。在其他系统上,您必须找到其他东西;time( NULL )是经典的解决方案,但是当然,如​​果程序在同一秒内启动多次(即使在不同的机器上),它也会输出相同的序列。散列附加值,如进程 ID、机器的 IP 地址等,将大大改善情况。

最后:一些生成器会将种子作为第一个值返回。这是非常可预测的,特别是如果您只使用 time( NULL ). 您可能希望生成几个随机值,然后在开始实际使用它们之前将其丢弃。

于 2013-08-16T18:24:18.487 回答
1

您没有看到随机数生成器,因此每次运行应用程序时它都会为您提供完全相同的“随机”数集(这对于调试很有用)。要修复它,请将您的 main 修改为如下所示:

int danse = 0;
int main()
{
    std::srand(std::time(0)); // seed the random number generator
    danse = rand() % 101;
    // rest of your main
}
于 2013-08-16T18:19:39.657 回答