c++ - 如何锐化 rnd 生成器

标签 c++ qt

我正在制作俄罗斯方 block 并且有 7 个数字。 当我需要一个新图形时,我在 FigureFactory 类中这样做:

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

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

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

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

最佳答案

rand() 生成器没有任何问题。是您在每次调用 rand() 之前通过执行 srand(time(NULL)) 明确要求它从相同的种子值重新启动。如果你这样做的频率足够高,time 将简单地返回相同的值,并且生成器将重置为相同的起点。难怪您会从 rand() 中获得相同的“随机”数字。

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

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

关于c++ - 如何锐化 rnd 生成器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16996615/

相关文章:

c++ - 如何从 UTF-8 字符串的每个字符中获取 UNICODE 代码?

C++ 约定 : Structure of Headers and Classes

qt - 使用 CMake 构建 Qt Qml 插件

c++ - 如何让选项卡控件接管 Qt Creator 中的整个窗口?

windows - Dependency Walker 父导入函数列表显示来自不同库的函数

c++ - CMake - 每次构建项目时如何停止构建每个依赖项

c++ - 在内存泄漏等方面还可以吗

c++ - 如何阻止和唤醒 boost 线程?

Qt postEvent() 和事件过滤器

c++ - Qt:QuaZip 提取文件并在 QProgressDialog 中显示其进度