我有一个简单的C程序,它应该用随机值填充数组(这是学校作业的开始)。我正在使用rand(),用srand(time())播种它。因为这在某个时间段内反复运行时往往会产生一些可预测的结果,所以我做了另一个非常简单的函数来给我一个更随机的种子值:
time_t getRandomSeed(int numberOfIterations)
{
int i;
time_t result=time();
for (i = 0; i < numberOfIterations; i++)
{
result = randomizeSeed(result);
}
return result;
}
time_t randomizeSeed(time_t seed)
{
time_t result, fullTime, Modifier1, Modifier2;
srand((unsigned int)seed);
fullTime = time();
Modifier1 = time() >> (rand() % 10);
Modifier2 = (unsigned short)time();
Modifier2 <<= (rand() % 9 + 9);
result = fullTime ^ Modifier1 ^ Modifier2;
return result;
}
在main中,我在声明2个int数组后在srand()内部调用它。当我返回main时,这些数组是垃圾,我无法弄清楚原因。
int main(void)
{
int randomNumbers[ARRAY_LENGTH];
int sortedNumbers[ARRAY_LENGTH];
srand((unsigned int)getRandomSeed(2));
fillArray(randomNumbers, sizeof(randomNumbers) / sizeof(randomNumbers[0]));
return 0;
}
我在第4行设置断点,并且我有一个完全正常的unititialized数组(在最近的运行中为0x00e1ea70)。然后我在第8行设置了另一个断点,所以我可以在它被传递到fillArray之前看到它。此时,数组的地址以某种方式显示为0xfffff04c,并且所有元素都显示“无法读取内存”,我认为这是有意义的,因为地址是垃圾。
有人能告诉我一下我的阵列发生了什么吗?
*请注意,这是针对学校作业的,所以我并不关心RNG是否安全,也不能使用任何第三方库。
更新: 每个请求,这是fillArray()的主体。但是,根据我的问题,问题发生在我们到达fillArray()之前,因为我在调用它之前设置断点。
void fillArray(int array[], size_t length)
{
size_t i;
for (i = 0; i < length; i++)
{
array[i] = rand()%1000 + 1;
}
return;
}
答案 0 :(得分:0)
在你的函数randomizeSeed()
中,你连续三次调用time()
而没有争论。
fullTime = time();
Modifier1 = time() >> (rand() % 10);
Modifier2 = (unsigned short)time();
函数原型是
time_t time(time_t *timer);
所以你应该注意你的编译器警告。从现在开始,您有未定义的行为。