RAND_MAX 宏:有符号还是无符号?

2024-03-01

我查阅了 C 标准(从 1999 年开始),它只说RAND_MAX应该至少为 32767,但没有说明该宏是否应扩展为有符号整数或无符号整数。单一 UNIX 规范 (link 1 http://pubs.opengroup.org/onlinepubs/7908799/xsh/stdlib.h.html, link 2 http://pubs.opengroup.org/onlinepubs/7908799/xsh/rand.html)和 Linux 人(link http://www.kernel.org/doc/man-pages/online/pages/man3/rand.3.html)不要增加任何清晰度。

有人会认为RAND_MAX应该是一个signed int因为那就是rand()返回。

但是,我发现一些编译器将其定义为无符号:

  • 古老的 Turbo C++ 1.01:#define RAND_MAX0x7FFFU
  • 不那么古老的 C++ Builder 5.5:#define RAND_MAX0x7FFFU
  • 仍然存在的 Open Watcom C/C++ 1.9:#define RAND_MAX32767U
  • DJGPP(gcc 3.3.4 for DOS):#define RAND_MAX 2147483647
  • MinGW(gcc 4.6.2 for Windows):#define RAND_MAX 0x7FFF
  • MS Visual Studio 2010(link http://msdn.microsoft.com/en-us/library/2dfe3bzd%28v=vs.100%29.aspx): RAND_MAX 定义为值 0x7fff
  • Tiny C 编译器 0.9.25:#define RAND_MAX 0x7FFF
  • lcc-win32 3.8:#define RAND_MAX 0x7fff
  • 佩莱斯 C 6.50:#define RAND_MAX 0x3fffffff #define RAND_MAX 0x7fff
  • 数字火星 C/C++ 8.52:#define RAND_MAX 32767

这使得像下面这样看似无害的代码变得不可移植,并由于签名到未签名的升级而崩溃:

cos(w * t) + (rand() - RAND_MAX / 2) * 0.1 / (RAND_MAX / 2);

rand()返回一个signed int在范围 [0,RAND_MAX].

If RAND_MAX被定义为unsigned int,值来自rand()晋升为unsigned int too.

如果是这样的话,区别就在于(rand() - RAND_MAX / 2)变为无符号整数与范围 [0,RAND_MAX-RAND_MAX/2] & [UINT_MAX+1-RAND_MAX/2,UINT_MAX-1] 而不是带符号整数与 [- 范围内的值的有符号差RAND_MAX/2,RAND_MAX-RAND_MAX/2].

无论如何,似乎RAND_MAX应该被签名,并且大多数(?)编译器都这样定义它,但是有没有任何权威来源说它应该被签名?较旧的标准? K&R?另一个 UNIX 规范?


是的,这看起来像是标准中的缺陷。

首先,现在可能没有人会定义rand()返回一个int。其目的显然是返回正数,并且不存在可以使用负返回的错误返回。如果今天引入这样的函数,则将其设计为使用无符号整数类型作为返回类型。我的猜测是它早于 C89 以及将无符号整数概念引入到该语言中。

然后,显然我们必须期望函数返回的最大值的定义与函数的类型具有相同的类型。在其他地方,宏被很好地定义为扩展到具有某种类型的表达式,因此在这里也是可能的。

至于你的问题,我认为最简单的便携式方法是将值首先缩放为双倍[0, 1)通过做类似的事情rand()/(RAND_MAX+1.0)并从那里导出所有的计算。无论如何你应该使用rand()仅当您的平台没有更好的伪随机生成器可用时,才将其作为最后的手段。例如,在 POSIX 系统上rand48family 是一个方便的替代品,具有明确描述的属性。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

RAND_MAX 宏:有符号还是无符号? 的相关文章

  • Boost 错误代码参考

    有谁知道在哪里可以找到升压错误代码的参考 特别是 异步套接字处理程序返回的错误代码 Google 和 grep 头文件已调为空 我从 Linux 上的 asio error hpp 中提取了错误值 顺便说一句 我仅使用标头 asio 而不是
  • 为什么这个 IA32 汇编代码有 3 个 leaal 指令?

    我编译了这个C函数 int calc int x int y int z return x 3 y 19 z 我在 calc s 中得到了这个 我正在注释正在发生的事情 file calc c text globl calc type ca
  • 在 ASP.NET Core 中全局重用变量

    我必须强制这些变量在我想使用的每个变量上重用 这让我很困难 我需要创建一个类来定义这些变量并在整个程序中使用它们 我怎样才能做到这一点 string RootFolderName Uplaod string ProductPictureFo
  • 是否有任何替代方法来实现 WebRTC SFU,只有 1 个上传流?

    我有一个服务器 能够将 WebRTC 媒体数据从 A 中继到 B 对于视频会议 如果我们采用 P2P 方法 则会创建一个网状网络 当P2P不起作用的时候 我们就可以拥有这个中继服务器 主要问题是在网状网络中 对于N个参与者来说 上传链路的数
  • 资源文件中的控制字符 C#

    我想添加Left To Right控制字符在resource resx文件输入Visual Studio 我在互联网上搜索并找到了一个名为在 NET 资源文件中转义序列的另一种方法 http www devx com tips Tip 34
  • 如何防止 Parallel.ForEach 循环在运行时更改任务数量?

    我正在使用Parallel ForEach循环做一些工作 我用localInit像这样 localInit gt new foo new Foo bars CreateBars 根据文档 https learn microsoft com
  • 委托 System.Action 不接受 1 个参数

    那个行动 readonly Action execute public RelayCommand Action execute this execute null public RelayCommand Action execute Fun
  • 安装/编译 pylzma(lzma python 绑定)

    我已经向作者提出了这个问题website http www joachim bauch de projects pylzma comment page 1 comment 5211 但我想我也可以在这里问 我一直在尝试使用以下设置安装 py
  • 如何使用 CMake 链接多个库

    我有一些与 DCMTK 相关的代码 如果我从命令行使用 g 我可以成功构建并运行它 这是代码 include dcmtk config osconfig h include dcmtk dcmdata dctk h int main Dcm
  • 对指针列表进行排序

    我再次发现自己在 C 中的一些非常简单的任务上失败了 有时我希望我能从 Java 中的 OO 中学到所有知识 因为我的问题通常是从像 Java 一样思考开始的 无论如何 我有一个std list
  • “双免”是什么意思?

    正如标题所暗示的那样 我是 C 语言的新手 并且很快就会有期中考试 我目前正在修改过去的论文 一个反复出现的主题是双重自由问题 我理解就是调用的过程free 在同一个内存位置两次 但我有几个问题我不能 100 确定如何回答 问题1 C中双重
  • 使用 MemoryCache 而不是普通的旧 Dictionary 的令人信服的理由是什么

    我刚刚遇到内存缓存 http msdn microsoft com en us library system runtime caching memorycache aspx这是 NET 4 中的新增功能 我知道如果你想的话它会很有用 限制
  • 在多个线程中添加和删除时 List 中的 null 值

    我知道 C System Collections Generic List 对象不是线程安全的 但我想知道为什么这段代码会生成空值 Task Run gt for var i 0 i lt 10 i var str Test i list
  • 如何根据条件退出 PostSharp 方面的 OnEntry 方法中的方法

    我希望方面根据如下条件退出方法调用 AttributeUsage AttributeTargets Method public class IgnoreIfInactiveAttribute OnMethodBoundaryAspect p
  • 设置了 OFN_ALLOWMULTISELECT 标志的 GetOpenFileName()

    我正在尝试使用 GetOpenFileName 通用对话框调用来弹出打开对话框并允许用户选择多个文件 我设置了 OFN ALLOWMULTISELECT 标志 并设置了 OFN EXPLORER 因此我得到了 新样式 文件选择框 当我设置
  • COM Interop 挂起会冻结整个 COM 系统。如何取消COM调用

    我正在使用通过 COM Interop 包装器公开的第三方 dll 然而 其中一个 COM 调用经常冻结 至少不会返回 为了至少让我的代码更加健壮 我异步包装了调用 getDeviceInfoWaiter is a ManualResetE
  • 基于 C++ 组件的类

    Hi 我正在使用容器编写一个基于组件的类 但是在考虑了许多不同的方法之后 我找不到真正符合我想要的方法 这是总体思路的一个例子 我已经写的代码 Abstract class Component class Component public
  • 在方法签名中使用 new 关键字通常只是为了可读性吗?

    我读过关于new关键词在方法签名中并看到了下面的例子this https stackoverflow com questions 1014295 c sharp new keyword in method signature发帖了 但还是不
  • 如何在 C 中将 int 和数组保存在共享内存中?

    我正在尝试编写一个程序 让子进程在 Linux 上相互通信 这些进程都是从同一个程序创建的 因此它们共享代码 我需要它们能够访问两个整数变量以及一个整数数组 我不知道共享内存是如何工作的 我搜索过的每一个资源除了让我困惑之外什么也没做 任何
  • 系统.安全.加密与 PCLCrypto

    我们正在删除系统中的许多共享功能并将其移植到 PCL 库中 我在使用 PCLCrypto 时遇到问题 我正在获取数据库中的一些现有数据 并尝试使用相同的算法对其进行解密 我得到了值 但末尾有 16 个额外字节 这些字节都是垃圾 参见下面的代

随机推荐

  • 两个环绕角度的平均值[重复]

    这个问题在这里已经有答案了 可能的重复 如何计算一组循环数据的平均值 https stackoverflow com questions 491738 how do you calculate the average of a set of
  • Celery 无法在 AWS ECS 中工作

    我使用 docker 将 django 项目部署到 AWS ECS 服务 为了使用 celery 我将rabbitmq 设置为单独的 ec2 服务器 两个带有代理和结果后端的 ec2 问题是 celery Worker 在本地工作 但不在
  • 如何在不同线程中使用实体框架? [复制]

    这个问题在这里已经有答案了 我有一个实体框架dbContext以及对数据库进行一些操作的方法 如何正确地从多个线程调用它以避免死锁 连接错误等 我尝试了不同的方法 但也有很多例外 public void Foo Bar bar using
  • 什么是惰性分配?

    对象的延迟分配是什么意思以及它有什么用 延迟分配简单地意味着直到实际需要资源时才分配资源 这对于单例对象来说很常见 但严格来说 只要尽可能晚地分配资源 就有一个延迟分配的例子 通过延迟分配资源直到您真正需要它 您可以减少启动时间 如果您从未
  • 近似保序霍夫曼码

    我正在做算法和数据结构课程的作业 我无法理解给出的说明 我会尽力解释这个问题 我给出的输入是一个正整数n其次是n正整数 表示有序字符集中符号的频率 或权重 第一个目标是构造一棵树 为有序字符集中的每个字符提供近似的保序霍夫曼代码 我们要通过
  • Config.h - 没有这样的文件或目录

    文件 safe read c 包含lib config h 这个文件放在哪里 我在库中找到了许多具有此名称的文件 但我不知道哪个是正确的 UPDATE 我的文件有 include
  • 使用 dplyr 跨多行修改值的更有效方法

    在学习了 R 中数据转换的基础知识后 我现在正在数据集上进行练习 我确实有四个具有相同值的变量 我想将数值修改为字符串 我在这个网站上找到了函数 case when 并将其应用到每一列 但我真的很想做得更快 数据看起来像这样 climate
  • 有哪些可用于 gtk+ 开发的 IDE [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • MySQL 查询缓存:最大缓存大小限制为 128 MB?

    我的应用程序是数据库密集型的 因此我非常努力地确保应用程序和 MySQL 数据库尽可能高效地协同工作 目前 我正在调整 MySQL 查询缓存 使其符合服务器上运行的查询的特征 query cache size是可以存储在缓存中的最大数据量
  • openpyxl - 在现有合并单元格的 Excel 文件中添加新行

    Before https i stack imgur com 20JFY png After https i stack imgur com 9d7m6 png 所以 我试图在 Excel 表中添加 6 行 我用过 openpyxl wor
  • 如何在java或clojure中等待进程结束

    当我未启动的进程结束时 如何通知我 它们是恢复其退出代码和 或输出的方法吗 执行监视的进程将以 root 管理员身份运行 您可以通过调用列出所有当前进程并解析输出的 shell 命令来检查进程当前是否正在从 java 运行 在linux u
  • 如何使用 jQuery 销毁内联 CKEditor

    假设这是我的代码 div class editor div This is working for me editor click function this ckeditor This is the problem editor on f
  • 在 C# 源代码中打破长字符串的最佳方法

    我想知道在 C 源代码中打破长字符串的 最佳实践 是什么 是这个字符串吗 string1 string2 string3 在编译期间或运行时连接 它是在编译时完成的 这与 string1string2string3 完全相同 假设您有 st
  • Django 相当于每个用户的最新条目

    我很惊讶这个问题没有被提出 在网上找不到太多 Using Entry objects latest created at 我可以恢复所有 Entry 对象的最新条目 但是如果我想要每个用户的最新条目 这类似于 SQL 最新记录查询 但是我如
  • 执行内联powershell脚本

    我正在尝试从任务计划程序调用内联 powershell 脚本 以便在触发特定事件时发送电子邮件 我无法在任务计划程序操作窗口中使用本机 发送电子邮件 操作 因为 SMTP 服务器需要 SSL 并且无法在操作窗口中指定此操作 因此 我希望 启
  • 同步集合线程安全

    我有 System Collections Generic SynchronizedCollection 共享集合 我们的代码使用 Net 4 0任务库来跨越线程并将同步集合传递给线程 到目前为止 线程尚未向集合中添加或删除项目 但是新的要
  • Java 中什么时候方法调用可以更改参数,什么时候不可以更改参数? [复制]

    这个问题在这里已经有答案了 这是在java中 我尝试在这里寻找 谷歌搜索这个问题的答案 但找不到足够的答案 所以如果这是重复的 我深表歉意 我对更改您输入的参数的方法背后的规则感到困惑 例如 考虑以下示例 public static voi
  • logback每小时回滚时删除MaxHistory之前的日志

    我使用下面的附加程序 我可以看到回滚每小时发生一次 但我提到了
  • 如何测试包含 gets.chomp 的函数?

    我有一个使用 gets chomp 的简单函数 如下所示 def welcome user puts Welcome What would you like to do action gets chomp end 我想用它来测试它ruby是
  • RAND_MAX 宏:有符号还是无符号?

    我查阅了 C 标准 从 1999 年开始 它只说RAND MAX应该至少为 32767 但没有说明该宏是否应扩展为有符号整数或无符号整数 单一 UNIX 规范 link 1 http pubs opengroup org onlinepub