【问题标题】:C++ random int functionC++ 随机整数函数
【发布时间】:2011-06-26 07:19:00
【问题描述】:

各位stackoverflow的各位朋友大家好,最近刚开始学习C++,今天写了一个小游戏,但是随机函数不能正常工作。当我多次调用我的随机函数时,它不会重新生成一个数字,而是一遍又一遍地打印相同的数字。如何在不使用 for 循环的情况下解决此问题? 谢谢

#include "stdafx.h"
#include <iostream>
#include <time.h>
using namespace std;
int rolld6();

int main()
{
    cout<<rolld6()<<endl;
    cout<<rolld6()<<endl;
    system("PAUSE");
    return 0;

}

int rolld6()
{
    srand(time(NULL));
    return rand() % 6 + 1;;
}

【问题讨论】:

    标签: c++ function random srand


    【解决方案1】:

    srand(time(NULL)); 通常应该在main() 的开头一次完成,以后再也不要。

    每次您在同一秒内拨打rolld6 时,您拥有它的方式都会为您提供相同的号码,这可能是很多次,并且在您的示例中,几乎可以保证,因为你快速连续调用它两次。

    试试这个:

    #include "stdafx.h"
    #include <iostream>
    #include <time.h>
    #include <stdlib.h>
    
    int rolld6 (void) {
        return rand() % 6 + 1;
    }
    
    int main (void) {
        srand (time (NULL));
        std::cout << rolld6() << std::endl;
        std::cout << rolld6() << std::endl;
        system ("PAUSE");
        return 0;
    }
    

    要记住的另一件事是,如果您快速连续运行此程序本身两次。如果时间没有改变,您将在两次运行中得到相同的两个数字。这通常只是当您有一个脚本多次运行程序并且程序本身寿命很短时才会出现问题。

    例如,如果您调用 system() 并有一个调用了三次的 cmd.exe 脚本,您可能会看到如下内容:

    1
    5
    1
    5
    1
    5
    

    这不是你通常会做的事情,但应该牢记这一点,以防出现这种情况。

    【讨论】:

      【解决方案2】:

      随机函数(无论是什么语言)只是部分随机的。

      在每一种技术中,你都会有一个等价于

      srand(time(NULL));
      

      这段代码将随机函数播种到一个起始值,然后从那里生成数字 这意味着如果您总是重新播种相同的值,您将始终获得相同的数字

      在你的情况下,你想做这样的事情(调用 srand(time(NULL)); 只一次)。

      int rolld6 (void) {
          return rand() % 6 + 1;;
      }
      
      int main (void) {
          srand (time (NULL));
      ...
      //call your function here
      }
      

      使用相同值播种的优点之一是提供了重新生成相同随机数序列的可能性。

      在我的一个游戏中,我会在屏幕上随机放置对象,但我也想实现一个重试选项。这种从相同值重新播种的选项允许我在不存储所有随机值的情况下重做它^^

      【讨论】:

      • 你的第一句话不是真的。一些现代系统在硬件中包含真随机数生成器。这些可以在 Linux 上以/dev/random 的身份访问,并且不需要播种。
      【解决方案3】:

      您不断地重新播种随机数生成器。只在程序开始时调用一次srand(time(NULL));

      【讨论】:

        猜你喜欢
        • 2010-11-25
        • 2017-06-26
        • 1970-01-01
        • 2020-07-16
        • 1970-01-01
        • 2018-11-06
        • 1970-01-01
        • 2015-09-07
        • 2014-11-16
        相关资源
        最近更新 更多