正常运行时程序不起作用,但逐步调试结果是正确的

时间:2015-05-13 13:24:36

标签: c visual-studio debugging

在我在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],并打印结果。

3 个答案:

答案 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()一次。