【发布时间】:2014-09-19 18:55:17
【问题描述】:
我有一个代码可以创建一个包含 1000 个随机条目的数组,以及一个将它们合并到直方图中的例程。当我查看直方图的结果时,我发现 0 比应有的要多得多。我可以调试代码,我发现虽然我的原始数组看起来是正确的,但在我将数组传递给下一个例程之后,最后几个条目现在是 0。此外,如果我在同一个例程中运行更多行,甚至更多条目变为 0。有没有人知道可能导致这种情况的原因?
下面是代码供参考:
int n = 1000;
int m = 100;
double r;
double *p;//line 22
p = generate_random( n ); //returns array of length n containing random numbers between 0 and 1
r = group(p, m, n);
...
double group(double* rnd, int m, int n)
{
int count[100] = { 0 };
int length = n;
int i, bin;//line 66
double dx = 1/(double) m;//length of each interval
for (i = 0; i < length; i++)
{
bin = (int) floor(*(rnd+i)/dx);//line 71
count[bin]++;//count[0] should be the number of random elements between 0 and 0.1
}
...//some more code that sets return double
在创建 p 后在第 22 行进入调试器时,我可以看到 p 包含 1000 个随机数:
print *p = 0.78846
print *(p+851) = 0.3475
print *(p+999) = 0.9325
在第 66 行,它包含更少:
print *rnd = 0.78846
print *(rnd+851) = 0.3475
print *(rnd+999) = 0
在第 71 行 (i = 0) 甚至更少:
print *rnd = 0.78846
print *(rnd+851) = 6.9533e-310
print *(rnd+999) = 0
编辑:这是 generate_random 的代码:
double * generate_random( int n )
{
const unsigned int a = 1664525;
const unsigned int b = 1013904223;
const unsigned int M = pow(2,32);
int i;
double random_numbers[n];
unsigned int rnd = time(NULL)%M; //number of seconds since 00:00 hours,
// Jan 1, 1970 UTC
for (i = 0; i < n; i++)
{
rnd = (a*rnd + b)%M;
random_numbers[i] = (double) rnd;
//map to [0,1]
random_numbers[i] = random_numbers[i]/M;
}
return random_numbers;
}
【问题讨论】:
-
显示随机生成代码。我有一个怀疑。
-
@DrC:完成,见编辑
-
您发布的代码看起来很合理。您可以发布
generate_random()的代码吗?问题可能在于您如何创建数组。 -
对不起,为什么,如果您使用的是允许非常量数组大小自动声明的编译器(当您在
generate_random()中使用它们时(声明double random_numbers[n];和n函数的参数) 不要在第一个函数group()中对int count[n];---而不是int count[100];--- 做同样的事情?这样你就不会犯尺寸错误。 -
这只是我想要的最终代码外观的粗略草图。当我尝试设置
int count[n]时,编译器出错了,所以我想我先让它编译并工作,然后再担心类似的事情。
标签: c arrays memory-management