【发布时间】:2020-10-18 19:13:13
【问题描述】:
我准备在 C 中构建一个基于 Monte Carlo 的模拟,因为它非常快,我想知道为什么我的代码会产生均匀分布。
所以首先要接你,在我开始编码之前,我想象了几个球掉下来的图片,在每个点上它们可以随机分布向左或向右移动。图片显示在这里:https://www.youtube.com/watch?v=PM7z_03o_kk。
但我得到的有点奇怪。当我将散点设置为 10(在代码示例中设置为 100)时:
while(j < 100) // Number of abitrary change of direction
我得到了一张像高斯分布的图片,但只有 bin 对它有贡献。当它像代码中显示的那样足够大时,每个 bin 都会得到大约相同数量的粒子。这是 2D 案例,一旦按预期工作,它将扩展到 3D 案例。
其中仍然有一些变量不是真正必要的,只是为了避免我能想象到的任何可能的错误。我正在使用 gdb 来查找错误。当我刚刚用 gdb 运行 distr() 时,我发现如果上面的示例设置为 10,它只会产生偶数。当我转到 11 时,我发现 bin[0] 开始贡献很小的数量与其他人相比。我还跑了足够多的时间来看看它是否真的是伪随机的,我发现它应该可以工作。
我仍然无法弄清楚错误,所以我真的希望这里有足够多的人比我更聪明oO。
完整代码:
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <time.h>
#define SEED time(NULL)
int rando(void) // Monte Carlo method for choosing weather left or right
{
double temp=0;
temp = (double) rand()/RAND_MAX; // pseudo random number between 0-1
if (temp >= 0.5)
return 1; // Particle to the right
if (temp < 0.5)
return 0; // Particle ot the left
else
return EXIT_FAILURE;
}
int distr(void) // Binning particle
{
int i=10; // Center of bin
int j=0;
int k=0;
while(j < 100) // Number of abitrary change of direction
{
k=rando();
if(k == 1)
{
if ( i < 13) // Choose upper bound of bins
i++;
j++;
}
if(k == 0)
{
if (i > 7) // Choose lower bound of bins
i--;
j++;
}
}
return i;
}
int main(void)
{
srand ( SEED );
int* bin;
int binning;
int k=0;
int l=0;
int iter;
fprintf(stdout, "\nIterations: ");
fscanf(stdin, "%d", &iter);
bin = malloc(21*sizeof(int));
while (k < 20)
{
bin[k] = 0;
k++;
}
k = 0;
while(k < iter) // Count of particle ot distribute
{
binning = distr(); // Choosing the bin
bin[binning]+=1; // Counting binned particle per bin
k++;
}
while(l < 20)
{
fprintf(stdout, "\n %d", bin[l]);
l++;
}
return EXIT_SUCCESS;
}
我迫不及待地想读你的书,提前谢谢你, 恶意软件
【问题讨论】:
-
除了 PRNG 的可疑分布之外,做出 50-50 选择的最简单方法是简单地用
return rand() & 1;查看最低(或任何)位,您甚至不需要功能:if(rand() & 1) ... else ... -
这并没有太大帮助。所以肯定有不同的可能性来设置这种从均匀分布到正态分布的变化。这里的目标是从头开始设置几乎正确的高斯形粒子束。因此,我必须处理光束中不同数量的粒子形状,这就是我想要在一个月后实现的目标。
标签: c simulation montecarlo