首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用srand()来创建随机点?

如何使用srand()来创建随机点?
EN

Stack Overflow用户
提问于 2016-01-20 01:12:12
回答 1查看 138关注 0票数 0

我已经写了一个程序,它应该画一个矩形,并在那个矩形中创建一些随机点。用户将定义矩形的宽度(如X)、长度(如Y)以及他/她想要在矩形中创建的点数(如n)。我在创建点方面有一个问题,我用srand来创建随机点,但它创建的点比它应该创建的少。例如,如果n=3创建了2个点。我以前没用过srand。造成问题的代码如下:

代码语言:javascript
运行
复制
void create_mines(int x,int n)
{
    int i, random;

    srand(time(0));

    for (i = 0; i < n; i++)
    {
        random = rand() % (x);
        board[random][i] = '*';
    }

}

怎么了?

EN

Stack Overflow用户

回答已采纳

发布于 2016-01-20 01:15:37

有一件事你需要考虑的是,你可能会尝试点同一点不止一次,从而“失去一个点”。

您应该检查某个点是否已经点缀,然后再试一次。

此外,你应该确保他们不会要求更多的点是不可能的。

如果这个函数--通常您想确保您的程序只执行一次--我也会将调用移出srand()。

代码语言:javascript
运行
复制
void create_mines(int x, int n) {   /* THIS VERSION BROKEN, SEE BELOW */
    int i;
    int r;

    if (n > x) return;  /* not possible */

    /* do srand() in main */

    for (i = 0; i < n; i++) {
        do {
            r = rand() % (x);
        } while (board[r][i] == '*');
        board[r][i] = '*';
    }
}

如果您的程序(以及我上面的修改)失败,如果n > y是因为

代码语言:javascript
运行
复制
board[r][i] = '*';

在数组之外(i太大)。经修订的守则:

代码语言:javascript
运行
复制
void create_mines(int x, int y, int n) {
    int i;
    int rx;
    int ry;

    if (n > (x * y)) return;  /* more dots than spots for them */

    /* do srand() in main */

    for (i = 0; i < n; i++) {
        do {
            rx = rand() % x;
            ry = rand() % y;
        } while (board[rx][ry] == '*');
        board[rx][ry] = '*';
    }
}

如果x*yn大型,那么这种方法效率低下,而洗牌方法(如上面的注释中所建议的)可能是一种更好的方法。

票数 1
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34889834

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档