我正在制作俄罗斯方块并有7个数字。 当我需要一个新的数字时,我在FigureFactory类中执行此操作:
srand(time(NULL));
int shape = rand() % 7;
然后我从FigureFactory获取当前和下一个数字: the_figure = ff.getFigure(); next_figure = ff.getFigure();
结果是第一个和下一个数字是相同的。当快速推动空格键数次时,我得到的数字相同。
所以,rnd发生器有点粗糙。 你能推荐我如何使它更敏感吗?
答案 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)