0

我想用 C 编写计算机模拟代码。我对 C 非常陌生,主要有 Python 和 Javascript 方面的经验。我想要一些关于以下最佳实践的建议。

计算机模拟基于许多参数。指定这些参数值的最佳方法是什么?应该将它们指定为变量,还是应该使用#define宏设置它们的值。

例如,我可以做

int numpeople = 100;

或者,

#define numpeople 100

哪个是更好的做法,还是没关系?模拟中某些数组的长度取决于参数。如果我使用变量方法指定参数值,那么我不能使用它来指定长度数组。

例如,

// This is invalid.
int numpeople = 10;
int ids[numpeople];

在这种情况下,你会说我别无选择,我应该使用

#define numpeople 100
int ids[numpeople];

还是有另一种更好的方法。

最后,无论我以哪种方式定义参数,我都想在一个地方列出参数的可能值,然后让模拟针对每个可能的值运行。也就是说,假设 parameter1可以取值 100、200、300,parameter2也可以取值 5、25、50。

我想首先运行parameter1取值 100 和parameter2取值 5 的模拟。然后,我想用parameter1取值 100 和parameter2取值 25 来运行它...等等,对于可以用这些值形成的所有 9 种组合. 如果我不必在每次模拟完成时手动更改组合,我会更喜欢。有没有一种方法可以以某种形式列出所有组合(我要求推荐用于此组合的数据结构),然后让代码一次读取一个。这就是我在运行时设置参数值的方式。

可能没有一种方法可以做到这一点。但我将不胜感激您认为是一种好方法的任何方法。

如果您需要任何进一步的说明,请告诉我。

感谢您阅读本文和您的回答。

4

2 回答 2

3

如果您的模拟由许多值参数化,请考虑将它们作为单个结构传递给模拟设置。像这样:

struct Params {
  int num_people;
  int simulation_steps;
  int step_size;
  // ...
}

void your_simulation(const &Params params) {
  int people_ids[params.num_people];
  // ...
}

这样,您可以在标题、主文件或其他任何内容中设置多个运行。

Params small_sim = {
  .num_people = 10,
  .simulation_steps = 5,
  .step_size = 30,
};

Params big_sim = {
  .num_people = 100,
  .simulation_steps = 5000,
  .step_size = 3,
};

main() {

  if (...) {
    your_simulation(&small_sim);
  } else {
    your_simulation(&big_sim);
  }
}

这将使单元测试更容易,因为您可以设置具有已知预期输出的固定模拟,您也可以稍后扩展程序以从输入文件、命令行或其他地方获取其参数。

于 2013-08-31T22:50:01.190 回答
0

您还可以将参数值作为命令行参数传递给您的程序。

例如,

于 2013-09-01T01:58:29.713 回答