随机函数不断得到相同的结果
Random function keeps on getting same result
我正在编写一个随机模拟骑士之旅的程序。 (有关其含义,请参见维基百科:http://en.wikipedia.org/wiki/Knight%27s_tour)首先,我创建了一个国际象棋对象,它基本上只是一个 8*8 数组,其中包含用于指示骑士位置的数字。我创建了一个国际象棋对象并为骑士随机分配了一个位置。然后,我随机移动骑士,直到没有更多的合法移动和 returns 执行的移动数。
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;
}
并且在 BOTH 运行Tour() 中它输出:(其中 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
当我再次 运行 时,两个 运行Tour 输出:
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
所以随机函数在不同的运行中是随机的,但在每个运行中都是相同的。为什么会这样?如何修改代码,使 运行Tour() 在被调用时可以有不同的表现?非常感谢您阅读这个笨拙的问题。
因为您使用时间戳作为 srand
种子:
如果两个 runTours 在同一秒内,您认为您的代码会发生什么情况?
...
srand
应该恰好被调用 一次 次,而不是每次 runTour
的函数调用一次
尝试将 srand 调用移至主函数。您只需为生成器设置一次种子,而不是每次调用该函数时。
我正在编写一个随机模拟骑士之旅的程序。 (有关其含义,请参见维基百科:http://en.wikipedia.org/wiki/Knight%27s_tour)首先,我创建了一个国际象棋对象,它基本上只是一个 8*8 数组,其中包含用于指示骑士位置的数字。我创建了一个国际象棋对象并为骑士随机分配了一个位置。然后,我随机移动骑士,直到没有更多的合法移动和 returns 执行的移动数。
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;
}
并且在 BOTH 运行Tour() 中它输出:(其中 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
当我再次 运行 时,两个 运行Tour 输出:
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
所以随机函数在不同的运行中是随机的,但在每个运行中都是相同的。为什么会这样?如何修改代码,使 运行Tour() 在被调用时可以有不同的表现?非常感谢您阅读这个笨拙的问题。
因为您使用时间戳作为 srand
种子:
如果两个 runTours 在同一秒内,您认为您的代码会发生什么情况?
...
srand
应该恰好被调用 一次 次,而不是每次 runTour
尝试将 srand 调用移至主函数。您只需为生成器设置一次种子,而不是每次调用该函数时。