我正在为我的代码创建随机数,我正在使用种子方法进行调试。我想要做的是存储将由time(NULL)
函数使用的srand()
函数的返回值。该值将存储在日志文本文件中,以便可用于分析代码中出现的问题。
那么我应该如何printf
srand
函数中用作种子的确切值?
答案 0 :(得分:4)
正如已经评论的那样,time_t
几乎可以是任何东西,描述甚至会随着标准的版本而改变,所以你唯一知道的是它是一个数字。我说只有便携式将它写入文件的方法是读取其表示的字节并存储它们(*),例如,十六进制格式,或使用fwrite()
直接作为二进制格式。对于十六进制格式,您可以使用char *
对其进行别名,并通过从0
到sizeof(time_t) - 1
的索引来读取字节。
但是,您不需要time()
的确切返回值来实现您想要实现的目标,您只需要实际使用的种子!如果查看srand()
函数,则需要unsigned int
。因此,只需将time(NULL)
返回的内容首先转换为unsigned int
并存储该内容。
请注意,PRNG的内部工作方式也没有在标准中指定,因此如果您从用户那里获得了一个日志文件,那么如果他链接到另一个文件,则无法保证您可以从中重现相同的随机数序列C库。
(*)当然,这在不同的实现之间在运行时是不可移植的,因为它们将具有不同的表示。我想问题不在于那个,但为了完整性,如果你真的想要存储一个时间值,那么可以选择存储例如struct tm
的组件或类似strftime()
的内容。
答案 1 :(得分:1)
函数time()返回can be any integer or real-floating type的time_t
类型。
But you can cast it to a known type:
printf("%lld\n", (long long) time(NULL));
如果您只想存储二进制 time_t
值,以便稍后阅读,则可以执行以下操作:
写:
time_t t = time(NULL);
/* ... open file handle */
fwrite(&t, sizeof(t), 1, file);
读:
time_t t = 0;
/* ... open file handle */
fread(&t, sizeof(t), 1, file);
执行此操作时,您必须确保wrting和读取是由相同的二进制文件(或不同的二进制文件,但相同的编译器)完成的。