为什么c++ stdlib rand()函数在不同平台上对相同的种子给出不同的值?
Why does the C++ stdlib rand() function give different values for the same seed across platforms?
我知道rand()
函数根据给定的种子生成伪随机数,并且在给定的平台上,它将始终从相同的种子生成相同的数字序列,我想知道的是为什么它在使用相同库的平台上给出不同的序列?例如,rand()
是如何实现的?
c++标准没有指定rand()函数使用什么算法。
这个功能是由在你的系统上编写标准库的人定义的:微软的标准库包含在Visual Studio中,GNU的标准库包含在GCC中。
你的编译器正在选择从哪里获得它的库,所以在同一个系统上,不同的编译器可能有不同版本的标准库。要点是一样的:规范保证了哪些函数是可用的以及它们做什么;他们不是这么做的
rand()函数将计算一个伪随机整数序列在[0,{RAND_MAX}]范围内,周期至少为2^32。
rand_r()函数将计算一个伪随机序列[0, {RAND_MAX}]范围内的整数。{RAND_MAX}的值宏必须至少为32767。)
如果以相同的初始值调用rand_r()由种子指向,表示对象之间不修改连续返回并调用rand_r(),将生成相同的序列。
srand()函数使用参数作为一个新的序列的种子随后调用rand()返回的伪随机数。如果然后使用相同的种子值(序列)调用Srand ()伪随机数应重复。如果rand()之前被调用对srand()的任何调用都将生成与当srand()第一次被调用时,种子值为1。
rand()函数将返回中下一个伪随机数序列。
这是IEEE Std 1003.1 c标准关于rand()
函数应该如何表现的规定。它并没有说该如何计算这个数列。换句话说,每个实现者都可以自由选择他们自己版本的伪随机序列生成器。
你的观察表明他们利用了这种自由。
我可能还指出,rand()
是<cstdlib>
的一部分,这或多或少是C标准库的副本,新的库将为您提供更多的灵活性和标准序列生成器,如果你有一个新的足够的c++编译器,不依赖于C - c++互操作性。
- 正在查找文档以获得PS4平台的C++中的设备信息
- C/C++ - 查询平台相关的换行符(用于内存映射文件)
- 如何使用要传递给 mt19937 的可选随机种子参数设计函数
- 从给定种子生成相同的随机数序列C++
- 如何基于平台在制作文件中制作if语句?
- 在 Linux 平台的 C++ 中动态加载 DLL
- 无法使用 aarch64-unknown-nto-qnx7.0.0-g++-5.4.0 编译器交叉编译 QNX 平台的
- 如何判断类型双关语在我的平台上是否可以?
- 如何使用可视化代码和平台IO将环境变量注入CPP文件?
- 如何实现具有多个平台__FILE__和__LINE__信息的 C/C++ 可变参数日志记录宏?
- 如何使用可选的随机种子参数创建 roll_die() 函数
- 操作系统平台支持宏和提升库
- 平台游戏 - 下车时避免与平台碰撞
- NPM 安装:找不到平台工具集 = v141
- 如何在 64 位平台上计算 32 位哈希C++?
- 是否可以为boost::random::uniform_int_distribution<>设置确定性种子?
- 使用给定种子生成的随机数序列是否保证在标准版本中相同?
- 如果我在每个平台上使用相同的种子,随机结果会相同吗?
- C/ c++算法在不同平台上从相同的种子产生相同的伪随机数序列
- 为什么c++ stdlib rand()函数在不同平台上对相同的种子给出不同的值?