是否可以预测srand的随机数(time(0))?

时间:2016-02-15 23:14:28

标签: c++

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

3 个答案:

答案 0 :(得分:1)

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

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

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

(暂不考虑使用rand是否是一个好主意的问题。)

答案 1 :(得分:0)

  

...例如,将来某一天的时间14:40:32预测一个数字?

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

根据您的日期和时间给出一定的种子数,因此您可以检查连续生成的随机数序列。

答案 2 :(得分:0)

是和否。 如果的值为time_t,则只需对该值运行srand()的同一库版本,rand()肯定会产生相同的序列。< / p>

但你需要确定

  • 两个应用程序中的随机库使用相同的实现(我认为它是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 如果您知道时间(0)传递给srand()的值,则无法在给定的时间预测rand()调用的输出。对于任何给定的 n ,您可以预测第n次调用rand()的输出。