如何锐化rnd发电机

时间:2013-06-08 06:05:21

标签: c++ qt

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

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

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

结果是第一个和下一个数字是相同的。当快速推动空格键数次时,我得到的数字相同。

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

2 个答案:

答案 0 :(得分:2)

rand()生成器没有任何问题。是您在每次调用srand(time(NULL))之前通过rand()明确要求它从相同的种子值重新启动。如果您经常这样做,time将返回相同的值,并且生成器将重置为相同的起始点。难怪你得到同样的"随机"来自rand()的数字。

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

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

答案 1 :(得分:1)

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

另外,在你的兰特上使用%7会给你带来不好的分配。

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

int shape = (int)((((double)std::rand()) / RAND_MAX) * 7)