【问题标题】:C++ Simple 0-10 multiplication flashcard using rand()使用 rand() 的 C++ 简单 0-10 乘法抽认卡
【发布时间】:2012-09-02 20:24:06
【问题描述】:

我无法理解 C++ 中的 rand() 和 srand() 的概念。我需要创建一个显示两个随机数的程序,让用户输入响应,然后将响应与消息匹配并执行 5 次。

我的问题是如何使用它,说明说我不能使用 time() 函数,而且这似乎在每个关于 rand() 的在线教程中都有。

这是我目前所拥有的。

#include <iostream>
#include <cmath>
#include <cstdlib>

using namespace std;

int main()
{

int seed;
int response;

srand(1969);
seed=(rand()%10+1);

cout<<seed<<" * "<<seed<<" = ";
cin>>response;
cout<<response;
    if(response==seed*seed)
    cout<<"Correct!. you have correctly answered 1 out of 1."<<endl;
    else 
    cout<<"Wrong!. You have correctly answered 0 out of 1."<<endl;

这只是输出 6*6 或 7*7 之类的东西,我认为种子变量不一定不同但不是一直相同?

这是输出的样子:

3 * 5 =
34
Wrongo. You have correctly answered 0 out of 1.
8 * 1 =
23
Wrongo. You have correctly answered 0 out of 2.
7 * 1 =
7
Correct! You have correctly answered 1 out of 3.
2 * 0 =
2
Wrongo. You have correctly answered 1 out of 4.
8 * 1 =
8
Correct! You have correctly answered 2 out of 5.

Final Results: You have correctly answered 2 out of 5 for a 40% average.

这些是要求:

您的程序应根据需要使用 rand() 生成伪随机数。您可以使用 srand() 来初始化随机数生成器,但请不要使用任何“自动”初始化程序(例如 time() 函数),因为它们可能与平台相关。您的程序不应使用任何循环。

【问题讨论】:

  • 好吧,既然您不能在 rand() 中播种一段时间,您是否可以要求用户输入一个数字并将其用作种子或类似内容?
  • 或将其设为命令行参数。
  • 不要在 C++ 中使用 srand()rand()。使用&lt;random&gt;,请参阅 oldrinb 的回答。

标签: c++ srand


【解决方案1】:

您使用srand() 来播种随机函数。这是必要的,否则每次运行都会得到相同的数字序列,每次调用rand()

您可以随心所欲地播种兰特。您会发现大多数教程都使用当前时间作为种子,因为每次运行程序返回的数字通常不同。

如果您真的不能使用 time() 功能,我会将种子作为命令行参数传递。

int main(int argc, char* argv[])
{
    srand(atoi(argv[1])); // Seed with command line argument.
}

【讨论】:

  • 我已经添加了我建议的解决方案。
  • 如果您知道种子,那么您可以预测数字。这不是随机的。
【解决方案2】:

您现在使用它的方式似乎很好。所有教程都使用time() 的原因是因为每次运行程序时数字都会不同。所以,如果你使用一个固定的数字,每次你的程序运行时,输出(数字生成)都是一样的。但是,根据您的要求,这似乎不是问题(如果您需要在每次运行程序时随机生成都不同,请在您的问题中指定)。

但是,rand()%10+11 to 10 的范围,而不是您想要的 0 to 10

编辑后

要获得所需的输出,您只需要像这样制作两个种子:

seed1=(rand()%11);
seed2=(rand()%11);
cout<<seed1<<" * "<<seed2<<" = ";

此外,您可以向用户询问seed,然后将其传递给srand,以使每次运行更加随机。

关于要求:

请不要使用任何“自动”初始化程序(例如 time() 函数),因为这些可能是平台相关的

std::time&lt;ctime&gt; 标头中的标准 C++ 函数。如果结果取决于平台,我不明白为什么这很重要。

您的程序不应使用任何循环。

这也是一个很奇怪的要求。循环是任何程序的基本构建块。这些要求对我来说似乎很奇怪,我想请你的教授或老师澄清一下。

【讨论】:

  • 如果一个数字是可预测的,它就不是随机的,是吗?
  • @SaniHuttunen:是的,这是真的。但是,只有在您多次运行该程序时,该数字才是可预测的。也许这就是 OP 想要的,但问题描述没有具体说明。
  • 嗯......对我来说,“两个随机数”表明每次运行时这些数字应该是(伪)随机的。但我可能弄错了。
【解决方案3】:

顺便说一句,由于这是 C++,你应该真正寻求使用std::uniform_int_distribution,例如

#include <functional>
#include <random>
...
auto rand = std::bind(std::uniform_int_distribution<unsigned>(0, 10),
    std::default_random_engine());

现在,您可以使用rand() 生成所需间隔内的数字。

【讨论】:

    【解决方案4】:

    在 Windows 上,如果 time(),您可以使用 GetTickCount()
    您可以使用不需要播种的rand_s
    在 *nix 系统上,您可以使用 /dev/random。

    (How to use /dev/random)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-18
      • 1970-01-01
      • 1970-01-01
      • 2016-05-22
      • 1970-01-01
      • 2012-08-30
      相关资源
      最近更新 更多