c++ 显示奇数和偶数总数的范围内兰德数生成

qrjkbowd  于 2023-04-13  发布在  其他
关注(0)|答案(1)|浏览(99)

目前工作在一个基本的数字生成程序,发现总奇数和偶数在它的结尾,而我学习C++.我目前有一个问题,我不能弄清楚我如何能编码的能力,找到并显示总奇数和偶数到我目前的代码.
当前代码:

#include<iostream>
#include<cstdlib>
using namespace std;

int main()
{

    // Providing a seed value
    srand((unsigned) time(NULL));

    // Loop to get 5 random numbers
    for(int i=1; i<=6; i++){
        
        // Generate random number between 10 and 20

        int random = 10 + (rand() % 11);

        // Print the random numbers
        cout<<random<<endl;
    return;
}

我尝试了一些东西,但似乎没有任何工作与我目前的代码。

xnifntxz

xnifntxz1#

好了,让我们编译代码,并处理对调用rand()生成的偶数和奇数进行计数所需的逻辑。

  • 防止代码编译时出错 *
  • for循环声明后的大括号不匹配,例如for(int i=1; i<=6; i++){(您没有关闭'}'
  • 逻辑问题阻止代码工作 *
  • 你没有变量来保存rand()生成的偶数和奇数的数量。
  • 你应该解决的问题 *
  • 你的循环从i=1; i<=6开始迭代,以便循环五次。虽然这捕获了正确的计数,它显示了对C/C++中索引的一个基本误解,并且它是将循环变量与数组一起使用时最常见的错误之一。(或分配的对象集合)是***零索引的***。这意味着五元素数组的有效索引是0-4(包括0-4)。为了循环五-倍并且没有超出数组边界的索引,正确的for循环声明应该是for (int i = 0; i < 5; i++) { ... }。与循环限制保持一致将帮助您避免以后出现问题,
  • 虽然对于简短的示例问题是好的,参见Why is “using namespace std;” considered bad practice?
  • 另请参见C++: “std::endl” vs “\n”,并了解其差异。
  • 避免使用 MagicNumbers。如果您需要一个常量,#define一个或多个,或者因为这是C++使用constexpr(即将在C23中以有限的方式介绍C)。你有51011--嗯?它们是什么?给予这些常量命名。(这样做,您提供了一个方便的位置来更改代码顶部的值……)

总而言之,要找到rand()生成的偶数和奇数值的数量,您可以执行(添加上面的注解)类似于以下内容的操作:

#include <iostream>
#include <iomanip>
#include <cstdlib>

int main() {

  int odd = 0,   /* vars to track no. of odd / even numbers generated */
      even = 0;
  constexpr int nvals = 5,            /* number of values to generate */
                rngmin = 10,          /* range minimum for distribution */
                range = 11;           /* number of values in range */
  
  srand((unsigned)time(NULL));        /* seed random number generator */

  for (int i = 0; i < nvals; i++) {   /* loop 5 times, 0 <= i < 5 */
      
    /* get random number within range */
    int random = rngmin + (rand() % range);
  
    std::cout << std::setw(2) << random;  /* output value - 2-digts */
    if (random & 1) {                     /* if odd */
      odd += 1;                             /* increment odd */
      std::cout << "  :  odd\n";            /* output odd and newline */
    }
    else {                                /* otherwise */
      even += 1;                            /* increment even */
      std::cout << "  :  even\n";           /* output even and newline */
    }
  }
  
  /* output count of odd and even numbers generated */
  std::cout << "\nodd  : " << odd << "\neven : " << even << '\n';
}

(**注意:**如注解中所讨论的,random & 1random % 2 != 0相同-使用您选择的任何一个。按位AND只是避免了计算 * 模 * 时固有的潜在除法。这是一个学术差异)

编译字符串示例

始终在启用完全警告的情况下进行编译,并且在代码编译时没有警告之前不接受代码。
使用g++编译,您可以:

$ g++ -Wall -Wextra -pedantic -Wshadow -Werror -std=c++17 -Ofast -o rand-count-odd-even-c rand-count-odd-even-c.cpp

对于Microsoft编译器,使用/W3足以启用完整警告,而/Wx将导致任何警告被视为错误。

示例使用/输出

$  ./rand-count-odd-even-c
13  :  odd
16  :  even
13  :  odd
13  :  odd
12  :  even

odd  : 3
even : 2

C++提供伪随机数生成

参见Pseudo-random number generation
要使用C++伪随机数生成库做同样的事情,只需选择要使用的随机数生成引擎(std::mt19937 Mersenne Twister引擎是常见的选择),并使用该引擎在std::uniform_int_distribution中生成数字。其余部分相同,只是生成的是10值而不是5,例如。

#include <iostream>
#include <iomanip>
#include <random>

int main()
{
  int odd = 0,                /* variables to track no. of odd/even numbers */
      even = 0;
  constexpr int nvals = 10,   /* number of values to generate */
                rngmin = 10,  /* range minimum for distribution */
                rngmax = 20;  /* range maximum for distribution */
  
  /* create random device and mersenne twister engine */
  std::random_device rd;
  std::mt19937 mt (rd());

  /* create a uniform_int_distribution between rngmin and rngmax */
  std::uniform_int_distribution<int> uniform_dist(rngmin, rngmax);
  
  for (int i = 0; i < nvals; i++) {     /* loop nvals times */
    int rand = uniform_dist(mt);          /* get random in range */
    std::cout << std::setw(2) << rand;    /* output value 2-digts */
    if (rand & 1) {                       /* if odd */
      odd += 1;                             /* increment odd */
      std::cout << "  :  odd\n";            /* output odd and newline */
    }
    else {                                /* otherwise */
      even += 1;                            /* increment even */
      std::cout << "  :  even\n";           /* output even and newline */
    }
  }
  
  /* output count of odd and even numbers generated */
  std::cout << "\nodd  : " << odd << "\neven : " << even << '\n';
}

(编译同)

示例使用/输出

$ ./rand-count-odd-even
20  :  even
11  :  odd
14  :  even
14  :  even
14  :  even
16  :  even
19  :  odd
16  :  even
13  :  odd
19  :  odd

odd  : 4
even : 6

看一下这两个例子,希望它们能让你开始。书签cppreference.com并将其用作参考。请参阅:The Definitive C++ Book Guide and List拿起一本好的C++书籍,考虑到你开始使用的语言的C方法,这本书将是需要的。
如果你有问题就告诉我。

相关问题