c - 有没有一种方法可以使用链表来简化我的蒙特卡洛代码

标签 c linked-list montecarlo

嗨,我的代码目前包含三个函数,每个函数都会生成大量随机数。我想知道是否有一种方法可以让一个函数返回一个链表或多维数组以使其更整洁:

(从 http://pastebin.com/Y5aE6XKS 复制)

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
#ifndef RAND_MAX
#define RAND_MAX 2147483648
#endif
#define N 420000

double* rdm_X(void);
double* rdm_Y(void);
double* rdm_Z(void);

void main(void)
{
   double* Random_number_list_X = rdm_X();
   double* Random_number_list_Y = rdm_Y();
   double* Random_number_list_Z = rdm_Z();
   double X[N+1], Y[N+1], Z[N+1], density = 1, vol = 42.0;
   double sum = 0, sum_x = 0, sum_y = 0, sum_z = 0;
   int i;

   for (i = 0; i <= N; i++) {
      X[i] = 3 * Random_number_list_X[i] + 1;
      Y[i] = 7 * Random_number_list_Y[i] - 3;
      Z[i] = 2 * Random_number_list_Z[i] - 1;
      if ((Z[i]*Z[i]) + (sqrt(X[i]*X[i] + Y[i]*Y[i]) - 3)*(sqrt(X[i]*X[i] + Y[i]*Y[i]) - 3) <= 1) {
         sum += density;
         sum_x += X[i] * density;
         sum_y += Y[i] * density;
         sum_z += Z[i] * density;
      }
   }
   printf("(%.5lf, %.5lf, %.5lf)\n",
            sum_x/sum, sum_y/sum, sum_z/sum);
}

double* rdm_X(void)
{
   double* Random_number_list_X = calloc(N + 1, sizeof(double));
   int i;

   srand(time(NULL));
   for (i = 1; i <= N; i++) {
      Random_number_list_X[i] = (float) rand() / (float) RAND_MAX;
   }
   return Random_number_list_X;
}

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

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

最佳答案

几点:

  1. 不要自己定义 RAND_MAX
  2. main 返回一个 int。
  3. 只调用一次srand
  4. 消除对 srand 的额外调用,并使用一个函数来初始化您的数组。
  5. 您将 X、Y 和 Z 定义为数组,但实际上每个只使用/需要一个值。
  6. 似乎没有理由使用动态分配,因为您的数组大小是固定的。

关于c - 有没有一种方法可以使用链表来简化我的蒙特卡洛代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3687881/

相关文章:

c - 我们如何释放携带指向某个位置的指针的节点内存

c - 如何单独使用指针遍历字符串数组

c - 将整数类型转换为指针时出现整数指针赋值故障

java - 在 Java 的双向链表中将对象添加到另一个对象之前

c - 链表 - Free() 节点导致程序崩溃

Python 蒙特卡洛模拟循环

python - 使用GPU加速Python中的蒙特卡罗模拟

machine-learning - Amazon DynamoDB 和 FlockDB 之间有什么关系/区别?

c - 如何使用预处理器获取函数签名并声明另一个具有相同签名的函数?

c++ - 多库 CMakeLists.txt