【问题标题】:Why RAND_MAX differs on the same machine in linux from windows?为什么 RAND_MAX 在 linux 和 windows 的同一台机器上不同?
【发布时间】:2019-09-05 23:00:17
【问题描述】:

我试图使用rand() 生成一些随机数,但我首先检查了 RAND_MAX,因为我想生成一些大数。在 Windows 10 中 printf("%x",RAND_MAX); 提供 0x7fff 而在 linux 18.04 printf("%x",RAND_MAX); 提供 0x7ffffff 为什么当我在同一台机器上使用具有相同库的相同编译器 GCC 时最大范围会发生变化? 有没有一种方法可以让我在 Windows 上配置我的 IDE(代码块)或编译器以获得与在 linux 上相同的大小?

【问题讨论】:

  • rand() 在许多平台上几乎是随机的。如果您需要真正的随机库,则需要使用适当的随机数库。
  • 你在Windows下使用的是什么compilerversion
  • RAND_MAX 保证至少为 32767。您可以在所有机器上依赖至少 15 位。反复调用rand(),直到累积所需的位数。另请参阅 rand(3) man pageRAND_MAX 文档。您可能还对Understanding the algorithm of Visual C++'s rand() function 感兴趣
  • 谢谢大家

标签: c linux gcc random std


【解决方案1】:

这不是同一个库。 Linux 通过大多数 Linux 程序使用的通用libc(通常为glibc)提供rand; Windows 提供了不同的“通用”C 运行时,许多编译器和工具捆绑了它们自己的版本。

glibc is pretty Linux specific;你总是可以编写自己的 srand/rand/RAND_MAX 替换库,遵循 Linux 约定,但你不能只使用未修改的 Linux。

如果您想要可移植代码,我建议切换到 C++ 并使用 C++11 <random> API,它具有明确定义的可移植语义。 rand 是一个糟糕的 PRNG,努力使其可移植并不能解决糟糕的问题。

【讨论】:

  • “编写自己的随机数生成器”通常是一个糟糕的计划。正如您所指出的,C++ 拥有一套出色的随机数生成工具,并且在没有认真承诺和同行评审的情况下,不仅仅是一个人希望自己实现的工具。
  • @tadman:嗯,在这种特殊情况下,您基本上可以复制glibc 使用的实现。但我并不是真的推荐它。 C++ random 库可能是可移植性更好的选择。
  • “Windows 提供了不同的“通用”C 运行时”--> 不太确定操作系统是否提供了 rand()。据报道,我怀疑 OP 没有在 Windows 上使用gcc
  • @CacahueteFrito:你是说/dev/random吗?因为这通常不是最好的选择(/dev/urandom 几乎总是你想要的;/dev/random 的“额外安全性”通常是一种错觉,并且以触发阻塞操作为代价),而且它不可移植;最接近的 Windows 等效项是 CryptGenRandom
  • /dev/urandom 几乎总是你想要的” - 推荐/dev/urandom/dev/random 不是。来自kernel crypto 邮件列表上的 Theodore Ts'o:“实际上没有人使用 /dev/random。它本质上是一个已弃用的接口;十多年来一直推荐的主要接口是 /dev/urandom,现在,getrandom(2)。”
猜你喜欢
  • 2011-01-03
  • 2012-03-22
  • 2010-12-11
  • 1970-01-01
  • 2012-11-11
  • 2015-07-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多