0

我正在制作俄罗斯方块并且有 7 个数字。当我需要一个新图形时,我在 FigureFactory 类中执行此操作:

srand(time(NULL));
int shape = rand() % 7;

然后我从 FigureFactory 获取当前和下一个数字: the_figure = ff.getFigure(); next_figure = ff.getFigure();

结果是第一个图和下一个图是一样的。同样是我快速按几次空格键时得到的数字。

所以,rnd 生成器有点粗糙。你能推荐我如何让它更敏感吗?

4

2 回答 2

2

rand()发电机没什么问题。srand(time(NULL))是您在每次调用之前明确要求它从相同的种子值重新启动rand()。如果你经常这样做,time将简单地返回相同的值,并且生成器将重置到相同的起点。难怪您会从rand().

在每次调用rand(). 这没有道理。的全部意义rand()在于产生一个伪随机序列。所以,让它产生那个序列,不要重新启动它。如果您想根据当前时间随机化程序的行为,请在开始时仅重新播种一次。

您也可以稍后重新播种,但您应该在重新播种之间留出一些时间。如果重新播种之间的时间量是不可预测的,例如基于用户输入延迟等,那就更好了。

于 2013-06-08T08:08:37.377 回答
1

我认为您不必srand()每次都打电话。这似乎很糟糕。您应该更早地调用它,最好是在某些用户输入时(更好的随机性)。

此外,在你的 rand 上使用 %7 会给你一个糟糕的分布。

最好得到一个介于 0 和 1 之间的随机数,然后将它乘以您的计数 (7) 并取一个 (int)。

int shape = (int)((((double)std::rand()) / RAND_MAX) * 7) 
于 2013-06-08T07:06:20.147 回答