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

C 有没有一种方法可以使用链表来简化我的蒙特卡罗代码,c,linked-list,montecarlo,C,Linked List,Montecarlo,你好,我的代码目前有三个函数,每个函数产生大量的随机数数组。我想知道是否有一种方法可以让一个函数返回一个链表或多维数组,从而使它更整洁: 抄袭 这三个函数之间的唯一区别在于它们如何调用sleep。当然,您可以将这三个函数合并为一个函数,并在循环中调用它三次?每次程序调用仅调用srand一次,通常在main内部 有几点: 不要自己定义RAND_MAX。 main返回一个int。 只给srand打一次电话。 消除对srand的额外调用,并使用一个函数初始化阵列。 您将X、Y和Z定义为数组,但实际上每

你好,我的代码目前有三个函数,每个函数产生大量的随机数数组。我想知道是否有一种方法可以让一个函数返回一个链表或多维数组,从而使它更整洁:

抄袭


这三个函数之间的唯一区别在于它们如何调用sleep。当然,您可以将这三个函数合并为一个函数,并在循环中调用它三次?

每次程序调用仅调用srand一次,通常在main内部

有几点:

不要自己定义RAND_MAX。 main返回一个int。 只给srand打一次电话。 消除对srand的额外调用,并使用一个函数初始化阵列。 您将X、Y和Z定义为数组,但实际上每个数组只使用/需要一个值。 似乎没有理由使用动态分配,因为您的数组大小是固定的。
其他人已经解决了您的程序的一些问题,但是您是否意识到每次运行程序时都会泄漏超过10兆字节的内存?免费…

我不是第一个指出您应该只给srand打一次电话的人,但我会解释原因:

调用sr的频率越高,rand的输出就越不随机

兰德函数是一个伪随机数生成器。这意味着它生成的数字看起来是随机的,并且具有与随机性相对应的数学特性,但实际上它们不是随机的。兰德的输出实际上是一个固定的、完全确定的数字序列

或者,更确切地说,它产生了一大系列完全确定的序列中的一个。通过使用srand提供种子值,可以选择所需的序列。当您给sr和一个种子x时,rand的下一个输出将是伪随机但完全确定的第一个数!由种子x鉴定的序列。换言之:

int foo(int x)
{
   srand(x);
   return rand();
}
将为不同的输入返回不同的值,但对于给定的x,将始终返回相同的值。一点也不随意

这实际上是一个有用的功能,因为如果您在依赖rand输出的程序中发现了一个bug,您可以通过向srand提供相同的种子来可靠地复制该bug,以便从rand获得相同的序列,从而从您的程序中获得相同的行为

您需要调用srand一次的原因是,否则您的程序将始终从由seed 1标识的序列中接收相同的数字序列。在大多数情况下,您不想多次调用srand的原因是,您会反复将rand强制回到其序列的开头,而不是让它完整地为您提供其中一个序列。虽然任何给定序列都具有随机性,但序列起始序列不一定具有此特性

显然,如果你用同一个种子反复调用srand,那就特别糟糕了,因为每次你都会强迫rand回到同一序列的开头,所以rand总是会产生相同的值——这正是你不想要的

您经常看到srandtimeNULL的原因是,给定程序的任意两次调用之间的时间可能不同,这意味着程序每次运行时都将使用不同的伪随机序列。但是时间只会将时间返回到秒的粒度,因此,如果您在一次程序调用中重复执行此操作(如在您的程序中),并且调用srand之间的间隔不到一秒,您将使用相同的种子重复重新播种,正如您所观察到的那样,结果是荒谬的


一句话:在你第一次使用兰德之前,给srand打一次电话。请相信C库的实现者编写了一个像样的伪随机数生成器,不要试图通过补偿不存在的问题来增加随机性。

您问了六个问题,但从未接受过答案。试着做点什么!为什么你的代码在pastebin中而不在这里?我不知道我必须这么做,我现在就去做,Cheeset生成相同的随机数列表,如果我这样做,那么每次都不要重置你的随机种子。实际上默认种子是1。怎么会这样?我还不能完全胜任C,但我意识到内存泄漏是个坏消息!所以任何信息都是great@Jack:您的案例中的每个malloc calloc都需要相应的空闲或内存泄漏。N*3*sizeof double>10MB。您应该在main的末尾释放random_number_list_X。
int main(void) {
    /* initializations */
    srand(time(NULL));

    /* rest of program, with no more calls to srand() */
}
int foo(int x)
{
   srand(x);
   return rand();
}