首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >有没有一种方法可以将两个或两个以上的特定数字随机加或减到一个值数组中?

有没有一种方法可以将两个或两个以上的特定数字随机加或减到一个值数组中?
EN

Stack Overflow用户
提问于 2019-05-06 09:40:46
回答 1查看 256关注 0票数 0

我应该创建一个接受整数数组作为输入的函数,然后将数组中的每个值随机修改为-38或55。然而,我不确定如何随机选择一个数字是减去-38还是加55,以及如何进行这个过程。

我试着在我的函数中编写一个if语句,声明如果一个函数是偶数(arrayi % 2),那么减去-38,如果这个数是奇数(else语句),则加55。虽然这可能行得通,但这不是回答这个问题的正确方式,因为如果我想将偶数加到55该怎么办?或者反之亦然,奇数减去38?

代码语言:javascript
运行
复制
#include <iostream>
using namespace std;
#include <time.h>
#include <cstdlib>

int output(int array[]){

    for(int i = 0; i<5; i++){
      cout << array[i] << " ";
    }

}

int offset(int array[]){

  for (int j = 0; j < 5; j++) {
  int myrand = rand();
  if (myrand % 2 == 0){
  array[j] = array[j] - 38;
  }
  else{
  array[j] = array[j] + 55;
  }
  }


}

int main()
{
  srand(time(NULL));
   int array[5] = {1, 2, 3, 4, 5};
   cout << "Original: ";
   output(array);
   offset(array);

    return 0;
}

如果数组中的值是5,那么它应该有可能是10或0,以此类推,任何数字都可以。

EN

回答 1

Stack Overflow用户

发布于 2019-05-06 11:51:41

让我们让你开始,然后你可以从那里开始。当开始学习任何编程语言(或任何语言)时,您首先要了解语言的组成要素、单词以及将它们组合在一起的规则。对于一种编程语言来说,这是它的“语法”。每种语言都有自己的特点。您将从使用基本类型的最少示例开始学习语法,并从那里开始学习。

使用编译语言,您可以添加如何将文件中的正确语法集合转换为机器可读的可执行文件。如何将源代码编译成可执行文件。

在这一点上,你能做的最重要的事情就是和你的编译器交朋友,听它告诉你什么。您可以通过启用编译器警告来最有效地执行此操作,这样编译器就会为您指出它发现麻烦的那一行(在许多情况下还会指出该行中的字符)。规则是

“始终在启用警告的情况下编译,并且不接受代码,直到它在没有警告的情况下干净地编译。”

要启用警告,请在gcc/clang编译字符串中添加-Wall -Wextra -pedantic。对于和(windows上的cl.exe),请使用/W3。您总是可以添加额外的警告,但这将提供一个完整的设置,如果您遵循该规则,将节省数小时的调试时间。

以此为背景,让我们看看您正在尝试做什么。首先,您已经将您的问题标记为C++。我在上面的注释中为您提供了一个开始确定您的建议代码中需要哪些基本头文件的位置。C++ Standard Library headers。检查一下,你会发现C++提供了一个time.h实现作为头ctime (所有的标准C头通常都被命名为c......)。因此,在这里,根据您在代码中包含的内容,您至少需要

代码语言:javascript
运行
复制
#include <iostream>
#include <cstdlib>
#include <ctime>

虽然您可以在代码中使用5,但您希望避免对数字进行硬编码(除非所使用的标准库函数需要,例如C scanf字段宽度修饰符,在这种情况下不允许使用命名常量或变量)。硬编码数字是使用幻数调用的,最好避免使用。

在声明和初始化数组时,可以用空的[] (通常是不完整的类型)声明数组,但由于提供了带括号的初始化器,编译器在编译时使用提供的元素数来调整数组的大小。然后,您可以通过将sizeof array除以sizeof (an_element)来确定数组中的元素数量。您可以简单地取消引用该数组以获得第一个元素,因此您将看到它被写成如下所示:

代码语言:javascript
运行
复制
int main (void) {

    int array[] = {1, 2, 3, 4, 5};
    int nelem = sizeof array / sizeof *array;   /* number of elements */
    ...

现在,当将基本类型数组传递给函数时,还需要传递元素的数量。为什么?当数组作为参数传递时(实际上是在任何访问中,只有有限的例外),数组被转换为指向第一个元素的指针。如果您试图在将数组作为参数传递之后在函数中使用sizeof array / sizeof (an_element),您最终会得到sizeof (a_pointer) / sizeof (an_element),这肯定是行不通的。

因此,例如,在output()函数中,要将元素的数量与数组一起传递,您需要:

代码语言:javascript
运行
复制
void output (int array[], int nelem)
{
    for (int i = 0; i < nelem; i++) {
        cout << array[i] << " ";
    }
    cout << '\n';
}

同样的道理也适用于您的offset()函数:

代码语言:javascript
运行
复制
void offset (int array[], int nelem)
{
    for (int j = 0; j < nelem; j++) {
        int myrand = rand();
        if (myrand % 2 == 0) {
            array[j] = array[j] - 38;
        }
        else{
            array[j] = array[j] + 55;
        }
    }
}

(注意:每个函数的返回type已更改为void,而不是int。这两个函数都不需要提供成功/失败的指示,也没有返回调用函数中正在使用的值,这里是main()。在每种情况下,您只需打印数组的元素,或者就地更新它们的值。)

第一次尝试的其余部分只是在应用偏移量之前输出数组,然后在之后再次输出。您的main()可以是:

代码语言:javascript
运行
复制
int main (void) {

    int array[] = {1, 2, 3, 4, 5};
    int nelem = sizeof array / sizeof *array;   /* number of elements */

    srand (time(NULL));     /* seed random number generator */

    cout << "Original: ";   /* output original array */
    output (array, nelem);

    offset (array, nelem);  /* apply offset to array */

    cout << "Updated : ";   /* output original array */
    output (array, nelem);

    return 0;
}

如果您将所有代码放在一起,并在启用警告的情况下编译,将会发现您的代码在没有警告的情况下编译,并生成一个可执行文件。

示例使用/输出

代码语言:javascript
运行
复制
$ ./bin/randaddtoarray
Original: 1 2 3 4 5
Updated : 56 57 58 -34 -33

如果你多次运行它,你可能会发现你并不总是有偶数的奇数或偶数的随机数。这就是随机数的本质。

正如评论中提到的,有许多方法可以开发一个随机方案来应用您的-38+55。花一些时间研究不同的方法,并尝试实现它们,看看您的结果如何变化。您可能希望将5个以上的值添加到数组中,以便能够得出任何类型的分布结论。五个值确实不足以提供任何类型的清晰比较。

如果你还有进一步的问题,请告诉我。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55997872

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档