【问题标题】:Getting a subroutine to return three seperate arrays of random numbers in C获取一个子程序以在 C 中返回三个单独的随机数数组
【发布时间】:2010-08-01 23:36:05
【问题描述】:

我目前有一个用于返回指向数组的指针的子例程的代码。该数组是一维蒙特卡罗积分的随机数列表。我现在正在尝试做一个多维等价物,它需要 3 个随机数数组,而不是为每个数组创建一个单独的子程序,我试图制作一个返回 3 x N + 1 数组的子程序。有人可以帮我编写这个代码。一位朋友提到我需要一个双指针,但到目前为止,大多数网络资源都没有帮助。这是我的单数组代码:

double* rdm_Y(void)
{
   double* Random_number_list_Y = calloc(N + 1, sizeof(double));
   int i;
   sleep(1);
   srand(time(NULL));
   for (i = 1; i <= N; i++) {
      Random_number_list_Y[i] = (float) rand() / (float) RAND_MAX;
   }
   return Random_number_list_Y;
}

非常感谢! 杰克混合泳

【问题讨论】:

    标签: c pointers montecarlo subroutine


    【解决方案1】:

    动态分配 T 类型的二维数组(其中 T 可以是intdouble 等)的一般模式是

    #include <stdlib.h>
    
    T **alloc(size_t rows, size_t columns)  
    {
      T **arr = malloc(sizeof *arr, rows); // type of *arr is T *
      if (arr)
      {
        size_t i;
        for (i = 0; i < rows; i++)
        {    
          arr[i] = malloc(sizeof *arr[i], columns); // type of *arr[i] is T
          if (arr[i])
          {
            size_t j;
            for (j = 0; j < columns; j++)
            {
              arr[i][j] = initial_value_for_this_element;
            }
          }
        }
      }
      return arr;
    }
    

    【讨论】:

    • 好的,那么假设我将其设置为 3 行和 'N+1' 列。我会知道如何取消引用 main 中的一个指针,即获取数据结构,但是我如何指定它的第二行我试图访问(例如)。
    • @Jack Medley:如果你有T **x = alloc(3, N + 1);,那么x[1] 是第二行(x[1][50] 是第二行的第 51 个元素)。
    【解决方案2】:

    试试:

    struct res{
     double *arr1, *arr2, *arr3;
    };
    main(){
     struct res r;
     r.arr1 = rdm_Y();
     r.arr2 = rdm_Y();
     r.arr3 = rdm_Y();
     // in r you have 3 pointers to 3 separate arrays
    }
    

    或类似的东西

    【讨论】:

    • 这是C代码吗,我还没有遇到'struct'的东西:S
    • 是的,这是 c 很抱歉,但我对“缩进”它有疑问
    • 啊,好吧,我认为这与我想要的解决方案不同(使用双指针),但如果它没有损坏,请不要修复它!干杯
    【解决方案3】:

    我能想到的三种方法是:

    1. *double 到大小为 3xN 的一维数组(您可以假装它是三个数组)
    2. 一个**double 到一个由三个*doubles 组成的数组,每个数组都指向一个N 数组
    3. 一个struct包含三个*doubles,每个都指向一个N数组

    如果你不喜欢伪装方法1,你可以再声明两个*doubles,并将它们分别设置为返回值+N和+2N。另外不要忘记free(),您应该分别为每种方法执行 1、4 和 3 个free()s。

    【讨论】:

      猜你喜欢
      • 2011-03-28
      • 2019-01-26
      • 2020-07-08
      • 2021-06-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多