【问题标题】:How to store the random seed generated from time(NULL) in a text file?如何将时间(NULL)生成的随机种子存储在文本文件中?
【发布时间】:2018-03-13 13:24:42
【问题描述】:

我正在为我的代码创建随机数,并且我正在使用播种方法进行调试。我想要做的是存储time(NULL) 函数的返回值,srand() 函数将使用它。该值将存储在日志文本文件中,以便用于分析代码中出现的问题。

那么我应该如何printfsrand 函数中用作种子的确切值?

【问题讨论】:

  • 未指定。如果是 POSIX,则将其转换为 unsigned long long int。请注意,time_t 在 C 中甚至不需要是 整数,但 POSIX 需要这个。
  • 将结果存储在系统支持的最大无符号整数类型中(通常是uint64_t)这样打​​印?这是我可以看到它以任何方式接近可移植的唯一方法(考虑到time_t 通常 是整数类型)。问题是time_t 的实际类型是实现定义的,它可能是浮点类型,甚至是结构。因此,唯一真正可移植的打印方式是作为实际的文本日期时间戳。
  • OTOH,无论如何您都可以将time_t 值转换为unsigned long long first,然后使用 that 值作为随机种子
  • @AnttiHaapala 我不完全确定那个副本,因为我在这里闻到了一个 XY 问题,至少如果我正确理解 OP 的意图:能够重现以“随机”运行的程序数字以防万一出现问题...
  • 我认为你有一个 XY 问题。如果您想要可重现的伪随机生成,只需为初始化选择一个“随机”但固定的值并保留它。这将是time() 的返回值根本没有意义。

标签: c srand random-seed time-t


【解决方案1】:

正如已经评论的那样,time_t 几乎可以是任何东西,描述甚至随着标准的版本而改变,所以你唯一知道的是它是一个数字。我想说将它写入文件的唯一可移植方法是读取其表示的字节并存储它们(*),例如以十六进制格式,或使用fwrite() 直接作为二进制格式。对于十六进制格式,您可以使用char * 为其别名,并通过从0 到sizeof(time_t) - 1 的索引来读取字节。

但是,您不需要time() 的确切返回值来实现您想要实现的目标,您只需要实际使用的种子!如果您查看srand() 函数,它需要一个unsigned int。因此,只需先将 time(NULL) 返回的任何内容转换为 unsigned int 并存储即可。

请注意,标准中也没有指定 PRNG 的内部工作原理,因此如果您从用户那里获得日志文件,则无法保证如果他链接到不同的随机数,您可以从中复制相同的随机数序列C 库。


(*) 这当然不能在运行时在不同的实现之间移植,因为它们会有不同的表示。我想问题不在于那个,而是为了完整起见,如果你真的想存储时间值,那么要走的路就是存储例如struct tm 的组件或使用 strftime() 之类的东西。

【讨论】:

  • srand 初始化不能在平台之间移植,因为 rand 算法未指定,因此可能会有所不同。如果您需要在平台之间保持一致的 PRN 序列,则需要使用明确指定的算法,包括指定的播种过程,该过程将为种子使用明确定义的位宽。正如你所说,种子的来源是什么并不重要。只有种子本身。
  • @rici 你读过我的全部答案了吗?我想我也提到了这个问题:)
  • 仔细看了你的回答,没有。我阅读并赞成原件,然后看到我回复的最后一个编辑。我错过了中间编辑。对不起。
【解决方案2】:

函数time()返回time_t类型,can be any integer or real-floating type。

But you can cast it to a known type:

printf("%lld\n", (long long) time(NULL));

如果您只想存储 binary 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);

执行此操作时,您必须确保写入和读取是由相同的二进制文件(或不同的二进制文件但相同的编译器)完成的。

【讨论】:

  • 但是确切的值(long long)时间(NULL)会在 srand 函数中使用还是会在 srand 中使用另一个值?因为我需要存储将在 srand(time(NULL)) 中使用的 time(NULL) 的确切值?
  • 查看您自己的参考资料,其中有评论说“假设平台支持(长长)”。另一个解决方案提出了difftime,它是双倍的。
猜你喜欢
  • 2021-06-18
  • 2021-05-15
  • 2012-11-12
  • 2017-08-29
  • 2020-02-16
  • 1970-01-01
  • 2016-07-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多