【问题标题】:Is there a way to randomly add or subtract two specific numbers or more to an array of values?有没有办法在一组值中随机添加或减去两个或更多特定数字?
【发布时间】:2019-05-06 01:40:45
【问题描述】:

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

我尝试在我的函数中创建一个 if 语句,说明如果一个函数是偶数 (array[i] % 2),则减去 -38,如果数字是奇数(else 语句),则加 55。虽然这可能有效,但这不是回答这个问题的正确方法,因为如果我想将偶数加 55 怎么办?反之亦然,奇数减去 38?

#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,等等任何数字。

【问题讨论】:

  • 你知道如何随机做任何事情吗?你知道如何生成随机数或随机布尔值吗?
  • 好吧,如果元素是偶数减去 38 或奇数,加上 55 几乎不是随机的。 (除非数组的元素是随机的)。虽然还不错,但您也可以生成一个随机数、存储它、迭代位并根据 1/0 进行偶数/奇数运算。 (这减少了对rand 的重复调用)。有很多可能性。尝试几个,看看你是否找到一个相当有效并产生合理分布的。
  • @Beta 我知道如何使用rand函数,但只知道如何在特定范围内随机生成一个数字,比如做rand() % 100,会产生0-之间的随机数99.不过,我不确定如何将其与这个问题联系起来。
  • @DavidC.Rankin 我才刚刚开始学习数组,所以我不知道如何迭代机器人并根据我的代码中的位做偶数/奇数。尽管可能有很多方法可以解决这个问题,但我仍然对如何解决这个问题感到困惑。
  • 好的,这给了我们一些可以射击的东西。您必须知道数组中的元素数量才能开始。只要您只有 5 个元素,您的 for 循环就可以了。在循环中,在其基本形式中,您可以执行 for (int j = 0; j &lt; 5; j++) { int myrand = rand(); if (myrand % 2 == 0) array[j] = array[j] - 38; else array[j] = array[j] + 55; } 您可以使用 -=+= 作为速记,例如array[j] -= 38; 等...试一试,如果您仍然卡住,请告诉我们。

标签: c++ arrays function


【解决方案1】:

让我们开始吧,然后你就可以从那里开始了。当开始学习任何编程语言(或任何语言)时,你会从大量的语言组成、单词是什么以及将它们组合在一起的规则开始。对于作为其“语法”的编程语言。每种语言都有自己的。您从使用基本类型的最少示例开始学习语法,并从那里取得进展。

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

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

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

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

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

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

虽然您可以在代码中使用 5,但您希望避免硬编码数字(除非使用的标准库函数要求,例如 C scanf field-width修饰符,在这种情况下不允许命名常量或变量)。使用 magic-numbers 调用硬编码数字,最好避免使用。

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

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() 函数中,要将元素的数量与数组一起传递,您需要:

void output (int array[], int nelem)
{
    for (int i = 0; i < nelem; i++) {
        cout << array[i] << " ";
    }
    cout << '\n';
}

这同样适用于您的 offset() 函数:

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() 可能是:

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;
}

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

使用/输出示例

$ ./bin/randaddtoarray
Original: 1 2 3 4 5
Updated : 56 57 58 -34 -33

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

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

如果您还有其他问题,请告诉我。

【讨论】:

    猜你喜欢
    • 2022-06-10
    • 2012-01-28
    • 2020-07-20
    • 1970-01-01
    • 1970-01-01
    • 2021-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多