【问题标题】:C++ functions and random numberC++ 函数和随机数
【发布时间】:2013-06-27 23:31:44
【问题描述】:

当我写这段代码时:

#include <iostream>
#include <string>
#include <cstdlib>
#include <ctime>

using namespace std;


int random = std::rand() % 9 + 1;



int main()
{
    std::srand(std::time(0));
   if(random==1 || random ==2 || random == 3){
        cout << "Wolf" << endl;
   }  else if(random==4 || random ==5 || random == 6){
        cout << "Bear" << endl;
   }  else if(random==7 || random ==8 || random == 9){
        cout << "Pig" << endl;
   }
}

每次我运行它时,我都会打印出我想要的其他东西(狼、猪或熊)。 但是当我像这样在我的代码中添加这个函数时:

#include <iostream>
#include <string>
#include <cstdlib>
#include <ctime>

using namespace std;


int random = std::rand() % 9 + 1;

void func(){
   if(random==1 || random ==2 || random == 3){
        cout << "Wolff" << endl;

   }  else if(random==4 || random ==5 || random == 6){
        cout << "Bearr" << endl;

   }  else if(random==7 || random ==8 || random == 9){
        cout << "Pigg" << endl;

   }
}

int main()
{
    std::srand(std::time(0));


   if(random==1 || random ==2 || random == 3){
        cout << "Wolf" << endl;
        func();
   }  else if(random==4 || random ==5 || random == 6){
        cout << "Bear" << endl;
        func();
   }  else if(random==7 || random ==8 || random == 9){
        cout << "Pig" << endl;
        func();
   }
}

我希望每次运行它时都能打印出熊熊、狼沃尔夫或猪猪之类的其他东西。但是每次运行这个函数时,我都会得到相同的结果。有什么问题?
请帮助我,我是 C++ 新手。

【问题讨论】:

  • 我不相信你总是“打印别的东西”;看我的回答。此外,这段代码甚至无法在 Posix 上为我编译,因为 random 已经在 cstdlib 中定义。

标签: c++ function random numbers


【解决方案1】:

全局初始化器在调用main 之前执行。所以你永远不会重新设置你的 PRNG,因此总是绘制相同的“随机”数字。

也就是说,我不相信您的任何一个代码段在每次运行时都会产生不同的输出,因为它们具有相同的初始化顺序问题。

【讨论】:

  • 不确定我是否理解:这两个程序是相同的,只是在第二个程序中执行了一些额外的函数调用,它只读取random 的值。为什么会有任何不同?我发现真正令人惊讶的是 OP 的声明“每次我运行它时,我都会打印出其他东西(Wolf、Pig 或 Bear),就像我想要的那样”。我会说这不可能是真的
  • @AndyProwl:你是对的。我实际上并不相信 OP 关于原始代码的说法。让我们等待澄清。
  • 对不起,在第一个代码变量中,随机应该是主要的。 :(
  • @user2529389:那么,修复你的帖子吧!而且我想你可以看到我的答案是如何应用的(但如果你愿意,我可以更新它)。
  • @user2529389 您可以编辑您的问题以使用此新信息进行更新。底部有一个小edit链接,也可以去stackoverflow.com/posts/17394411/edit
【解决方案2】:

编辑:更改以匹配您声明的“bear”、“bearr”、“pig”、“pigg”目标。

int random = std::rand() % 9 + 1;

声明一个名为“random”的全局变量,它在启动期间,在main()之前被赋值。该值将是(rand() 的默认返回值以 9 为模)加一。它不会自动改变。

你似乎在寻找的是

int random()
{
    return (std::rand() % 9) + 1;
}

它定义了一个调用 rand 的函数,将值乘以 9,然后返回 1。编辑:要在“func()”函数中查看相同的值,请通过值或引用将其作为函数参数传递:

#include <iostream>
#include <string>
#include <cstdlib>
#include <ctime>

using std::cout;
using std::endl;

int random() {
    return (std::rand() % 9) + 1;
}

void func(int randNo){
    switch (randNo) {
        case 1: case 2: case 3:
            cout << "Wolff" << endl;
        break;
        case 4: case 5: case 6:
            cout << "Bearr" << endl;
        break;
        case 7: case 8: case 9:
            cout << "Pigg" << endl;
        break;
    }
}

int main()
{
    std::srand(std::time(0));

    int randNo = random();
            switch (randNo) {
        case 1: case 2: case 3:
            cout << "Wolf" << endl;
            func(randNo);
        break;
        case 4: case 5: case 6:
            cout << "Bear" << endl;
            func(randNo);
        break;
        case 7: case 8: case 9:
            cout << "Pig" << endl;
            func(randNo);
        break;
    }

            cout << "And now for something completely different." << endl;
    for (size_t i = 0; i < 10; ++i) {
        cout << i << ": ";
        func(random());
    }
}

【讨论】:

  • OP 想要Bear Bearr, Wolf Wolff or Pig Pigg,这可能会打印其他内容。显然,最简单的做法是更改main 中的cout 语句。如果最终目标比较复杂,涉及到另一个需要随机数的函数,可以作为参数传递。
猜你喜欢
  • 2014-01-16
  • 2011-06-26
  • 2014-08-19
  • 1970-01-01
  • 2014-04-27
  • 2014-12-25
  • 2017-06-26
  • 1970-01-01
  • 2012-08-24
相关资源
最近更新 更多