随机函数不断得到相同的结果

时间:2015-06-04 14:28:08

标签: c++ random dev-c++

我正在编写一个程序来随机模拟Knight的巡演。 (参见维基百科的含义:http://en.wikipedia.org/wiki/Knight%27s_tour)首先,我创建一个国际象棋对象,它基本上只是一个8 * 8数组,数字表示骑士的位置。我创建了一个国际象棋对象并为骑士随机分配一个位置。然后,我随机移动骑士,直到没有更多的合法移动并返回执行的移动次数。

int runTour ()
{   
    srand (time(NULL));

    Chess knight(rand()%8, rand()%8); //Initialize random chess object.
    knight.printBoard(); //Prints the board before moving
    int moveNumber = 0; //A number from 0 to 7 that dictates how the knight moves
    int counter = 0;

    while (moveNumber != -1) //A moveNumber of -1 means there is no more legal move
    {   
        moveNumber = knight.findRandMove(knight.getRow(), knight.getColumn()); //findRandMove is a function that returns a legal random move for the knight based on its position. It works perfectly.
        knight.move(moveNumber); //move is a function that moves the knight
        counter ++; 
    }
    knight.printBoard(); // Returns board when move is exhausted 
    return counter; //Returns number of moves performed.

}

有趣的是,虽然它从一次运行到另一次运行完全随机运行,但它仍然在同一次运行中输出相同的东西。例如,这是main()函数:

int main(){
    runTour();
    runTour();
    return 0;
}

在两个runTour()中输出:(其中0代表未到达的位置,1代表骑士的当前位置,达到9个位置)

0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0
0 0 0 0 0 1 0 0
0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 

0 0 0 0 9 0 0 0 
0 9 9 0 0 0 9 0
0 0 0 0 0 9 9 0
9 0 9 9 9 9 0 1 
0 0 9 9 9 9 9 9
0 9 9 9 9 0 9 0
9 0 0 0 9 9 9 9
0 0 9 0 9 9 0 9 

当我再次运行它时,两个运行输出:

0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 1
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 

0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 
0 0 0 0 0 0 9 9
0 9 0 0 9 9 9 0
0 0 9 9 9 9 9 9
1 0 9 0 9 9 0 9 

因此随机函数在不同的运行中是随机的,但在每次运行中都是相同的。为什么会这样?如何修改代码,以便runTour()在调用时具有不同的性能?非常感谢您阅读这个笨拙的问题。

2 个答案:

答案 0 :(得分:2)

当您使用时间戳作为srand种子时:
如果两个runTours都在同一秒内,您认为代码会发生什么? ...
srand应该被称为一个时间,而不是runTour

每个函数调用一次

答案 1 :(得分:0)

尝试将你的srand调用移动到你的main函数。你应该只需要为生成器播种一次,而不是每次调用函数。