如何限制rand函数可以生成的数字.(段错误)



我正在尝试用c++创建一个井字游戏

到目前为止,我已经设置了玩家和程序轮流出现的地方。程序的移动由rand()%10决定。生成数字1-9,tic tac toe中每个盒子对应一个数字。

但是这变成了一个问题,因为最终它会选择一个已经被填充的框。这似乎总是导致一个Segmentation Fault

是否有办法限制rand()的盒子是空的?我试过了,但他们似乎被忽视了。然后我必须让rand()继续尝试,直到它生成一个与空框对应的随机数。

void program_move(){
std::cout<<"My turn!n";
srand (time(NULL));
move = rand()%10;
if (boxes[move-1]!="x"&&boxes[move-1]!="o") {
boxes[move-1]="o";

}
else{while(boxes[move-1]=="x"||boxes[move-1]=="o")
{
srand (time(NULL));
move = rand()%10;

boxes[move-1]="o";

}

}

rand()%10生成0-9。所以move可以变成0。在这种情况下,访问boxes[move-1]是越界的。

你可以尝试变换索引,而不是限制随机生成器。

std::vector<int> indices(10);
std::iota(indices.begin(), indices.end(), 0);
std::random_device rd;
std::mt19937 gen(rd());
std::shuffle(indices.begin(), indices.end(), gen);
for(auto i : indices)
boxes[i] = "o";

注。如果您的boxes'大小为9,则必须在上述代码中将indices'大小更改为9

如果您希望所有数字都包含相同位数,则必须创建大量随机数。或者使用c++ 11中引入的一些新功能,比如std::uniform_int_distribution类:

std::random_device rd;
std::mt19937 gen(rd());
std::uniform_int_distribution<> dis(100000000, 999999999);
for (int n = 1; n <= 5; ++n)
std::cout << "random number " << n << " = " << dis(gen) << 'n';

你也可以只设置输出的宽度,并用前导零填充它:

std::cout << std::setw(10) << std::setfill('0') << std::rand() << 'n';

最新更新