【问题标题】:Is it possible to predict random number of srand(time(0))?是否可以预测 srand(time(0)) 的随机数?
【发布时间】:2016-02-15 23:14:27
【问题描述】:

我的 rand 数字是 rand()%6+1 又名掷骰子,当它基于“时间”时,是否可以制作一个控制台应用程序,在我想要的时间内预测未来的数字?例如预测未来某一天 14:40:32 的时间?

【问题讨论】:

标签: c++


【解决方案1】:

是的,前提是您使用 rand 的相同实现,即链接到相同版本的标准库。您只需要获取您感兴趣的时间的time_t 值,然后将其传递给srand 并调用rand 以获取该值。

例如,如果time_t 保存自纪元以来的秒数(大多数实现都是这种情况),那么您可以执行以下操作以获取 rand 返回的值,时间为 10 秒-未来的种子:

std::srand(std::time(nullptr) + 10);
std::cout << std::rand();

(抛开使用rand 是否是个好主意的问题。)

【讨论】:

  • 如何制作一个控制台应用程序,在未来 +10 秒内向我显示所有随机数?例如 14:48:53 数字:3、14:48:54 数字:5 等等
  • @Sick654:简单。您通常使用time 值调用srand,但没有什么可以阻止您使用time()+10 调用srand
  • 好的,我明白了,但是如何创建一个循环,在控制台上每秒向我显示预测时间,然后在它旁边显示随机数?
  • @Sick654 :输入所需的说明。如果您需要这方面的帮助,请选择一本 C++ 书籍。
【解决方案2】:

...例如预测未来某一天 14:40:32 的时间?

当知道rand() 究竟是如何在某个种子上生成伪随机数时,这是可能的(大多数编译器开源代码实现都可用)。

你有一个从你的日期和时间给定的种子数,因此你可以检查连续生成的随机数序列。

【讨论】:

    【解决方案3】:

    是的,不是的。 如果你的值是time_t,那么只需在该值上运行相同的库版本srand()rand() 肯定会产生相同的序列。

    但你需要确定

    • 两个应用程序中的随机库使用相同的实现(我认为是 Mersenne Twister,但我需要检查一下)
    • 两个应用程序的时钟是同步的。如果您认为主应用程序的时钟是 14:30:17,但实际上是 14:30:18,那么在监视应用程序中输入 14:30:17(当然)会得到不同的值.
    • 在两个应用程序中调用rand() 的顺序是相同的,即您感兴趣的 srand() 和 rand() 之间的调用次数是您自己知道的。

    最后一点可能是个大戏。

    假设你知道应用程序是用 srand(T) 初始化的,并且你知道 T。现在是的,你知道它的 rand() 的所有未来提取。但是你仍然需要知道你在序列中的哪一点。

    在格林威治标准时间 19:30:17 提取的数字将不取决于“格林威治标准时间 19:30:17”,而是取决于自调用 srand() 以来之前提取了多少数字。

    TL;DR如果您知道 time(0) 传递给 srand() 的值,则无法预测 rand() 调用在给定时间的输出 。您可以预测任何给定 n 的第 n 次调用 rand() 的输出。

    【讨论】:

    • glibc 中正常的rand 不是 Mersenne Twister。但关键当然是,普通 C 库中的随机数生成器只有这么多,因此猜测其中一个并不难[或尝试所有三个或四个]。
    猜你喜欢
    • 2011-06-11
    • 1970-01-01
    • 2020-07-25
    • 1970-01-01
    • 1970-01-01
    • 2017-04-14
    • 2020-07-13
    • 2011-11-23
    相关资源
    最近更新 更多