【问题标题】:how to use srand() in order to create random dots?如何使用 srand() 来创建随机点?
【发布时间】:2016-01-22 00:50:55
【问题描述】:

我编写了一个程序,它应该绘制一个矩形并在该矩形中创建一些随机点。用户将定义矩形的宽度(作为 X)和长度(作为 Y)以及他/她想要在矩形中创建的点数(作为 n)。我在创建点时遇到问题,我使用 srand 创建随机点,但它创建的点比预期的要少。例如,如果 n=3,它会创建 2 个点。我以前没用过srand。 这是导致问题的代码:

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] = '*';
    }

}

怎么了?

【问题讨论】:

  • 您应该尝试在每一步打印出random 的值,以查看您是否遇到了冲突。 “随机”不是意味着均匀分布。如果您想要精确地获得n 不同的点,您可以考虑用n 点预先填充板,然后使用随机算法重新分配它们。
  • 如果 random 值超出 0...(x-1) 的范围,那么程序将有未定义的行为。如果 n 值超出 0...(y-1) 的范围,则程序将具有未定义的行为。建议:1)添加代码来检查限制 2)使用另一个调用 rand() 而不是使用 i 来索引数组。 3) 将y 值作为参数传递给函数。 4) random 是一个众所周知的函数名,它与#include &lt;stdlib.h&gt; 语句一起被引入代码(连同srand()rand() 函数),因此不应用作变量名。
  • rand() % (x) 怎么会落在 0..x-1 之外?这不是模数的定义吗?

标签: c visual-studio-2012


【解决方案1】:

您需要考虑的一件事是,您可能会多次尝试在同一个点上点,从而“丢失”一个点。

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

您还应该确保他们不会要求比可能更多的点。

如果这个函数,我也会把对 srand() 的调用移出——通常你想确保你的程序只执行一次。

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 &gt; y,你的程序(以及我上面的修改)会失败,因为那时

board[r][i] = '*';

在数组之外(i 太大)。修改后的代码:

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,则此方法效率低下,并且随机播放方法(如上面 cmets 中所建议的)可能是更好的方法。

【讨论】:

  • 我应该如何预防这种情况?
  • 有多种方法可以防止它,一种可能性是暴力破解,有点像if (board[random][i] == '*') { --i; continue; }
  • 您是否多次调用 create_mines()?
  • 不,我只调用一次
  • 那么srand的事情就不那么重要了
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多