在我在visual studio 2013上写的下面的代码中,我按了 Ctrl + F5 但是没有打印出正确的结果,我一步一步地调试它结果是对的。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <stdint.h>
int randfoo(void)
{
time_t ts;
int a[10];
unsigned int randdata = time(&ts);
srand(randdata);
return (rand() % 100);
}
int randNumber(int firstNum, int lastNumber, int result[][6])
{
int ret_val = -1;
int value1;
if ((firstNum > 0) && (firstNum < 5))
{
if ((lastNumber>0) && (lastNumber < 7))
{
for (int i = 0; i < firstNum; i++)
{
for (int j = 0; j < lastNumber; j++)
{
value1 = randfoo();
result[i][j] = value1;
printf("a[%d][%d]=%d\n", i, j, result[i][j]);
}
}
ret_val = 0;
}
else
{
ret_val = -1;
}
}
else
{
ret_val = -1;
}
return ret_val;
}
void main()
{
int buff[4][6];
randNumber(4, 6, buff);
system("pause");
}
第一个函数randfoo只是为了生成一个rand数。 第二个函数randNumber,用于将rand数放入结果[4] [6],并打印结果。
答案 0 :(得分:1)
您在srand(randdata);
的每次通话中都使用randfoo()
。 srand()
用于{em>种子 rand()
的PRNG。你每次都不会播种。
只需在srand(randdata)
和main()
中使用rand() % 100
直接在所有作业中使用。
你可以摆脱整个randfoo()
功能,恕我直言。
答案 1 :(得分:0)
如果在CPU周期时反复一次又一次地访问,随机内容不会随机。要阅读有关rand的更多信息,请阅读this页面。
rand的期间是实现定义的,但通常会下降 大约2 ^ 32-1。将其与Mersenne Twister算法进行比较 是2 ^ 19937-1。您通常需要一个随机数的周期 生成器超过预期生成的数量, 因为那是序列重复的点。
来自SO的另一个答案(source link):
在每次打电话之前都不要打电话给srand。当你的时候叫它一次 程序开始。
您可能需要查看此SO question。
答案 2 :(得分:0)
解释它工作的原因可能是有用的。当你调试它时,&#34;没有工作&#34;当你运行它。
当你正常运行时,它的执行时间比1秒少得多。因此,time()
函数总是返回相同的时间(除非你非常幸运,并且完全在第二个边界上运行),因此你使用相同的值调用srand()
,因此rand()
返回每次调用randfoo()
时的值相同。
然而,当您调试它时,在调用randfoo()
之间可能需要几秒钟,因此您会获得不同的time()
值,这会使伪随机生成器具有不同的值,因此不同{ {1}}值。
Heisenbug的一个很好的例子,当你试图找到它时,这个bug就会消失。正如其他答案所说,解决方案是在程序开始时简单地调用rand()
一次。