- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我查阅了 C 标准(自 1999 年起),它只说 RAND_MAX
应该至少为 32767,但没有说明这个宏应该扩展为有符号整数还是无符号整数。单一 UNIX 规范(link 1、link 2)和 Linux 手册(link)没有增加任何清晰度。
有人会认为 RAND_MAX
应该是一个 signed int
,因为这就是 rand()
返回的值。
但是,我发现一些编译器将其定义为无符号:
这使得像下面这样看似无害的代码变得不可移植,并且由于已签名到未签名的升级而崩溃:
cos(w * t) + (rand() - RAND_MAX / 2) * 0.1 / (RAND_MAX / 2);
rand()
返回 [0,RAND_MAX
] 范围内的 signed int
。
如果 RAND_MAX
定义为 unsigned int
,则 rand()
的值将提升为 unsigned int
也是。
如果是这种情况,差值 (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 和无符号整数概念在该语言中的引入。
然后,很明显,人们必须期望函数返回的最大值的定义与函数之一具有相同的类型。在其他地方,宏被很好地定义为扩展到具有特定类型的表达式,所以这在这里也是可能的。
至于你的问题,我认为最简单的方法是通过执行类似 rand()/( RAND_MAX+1.0)
并从那里导出所有计算。在任何情况下,如果您的平台没有更好的伪随机生成器可用,您应该仅将 rand()
用作最后的手段。例如,在 POSIX 系统上,rand48
系列是一个方便的替代品,具有详细描述的属性。
关于c - RAND_MAX 宏 : signed or unsigned?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10708433/
这个简单的代码: int main() { srand(time(NULL)); const int size = rand() % RAND_MAX; int numbers[si
我希望生成介于 0 和 1 之间的随机数。(显然,这在其他地方也有应用。) 我的测试代码: #include #include #include int main() { double uR;
这website声明宏 RAND_MAX 的值是库相关的,最小值为 32767。它没有进一步详细说明。 依赖库是什么意思??这是否意味着假设有来自两个不同库的两个宏 RAND_MAX,我们必须通过使用
我正在尝试确定 RAND_MAX 是否可以放入 unsigned int 变量中。翻阅C99标准后,我只发现RAND_MAX保证值至少为32767。虽然我知道RAND_MAX扩展为int值,但我不确定
Accelerated C++ Andrew Koenig 的第 7-9 题问: 7-9. (difficult) The implementation of nrand in §7.4.4/135
已结束。此问题正在寻求书籍、工具、软件库等的推荐。它不满足Stack Overflow guidelines 。目前不接受答案。 我们不允许提出寻求书籍、工具、软件库等推荐的问题。您可以编辑问题,以便
这个问题已经有答案了: How to get a larger random number from the c function rand() (4 个回答) 已关闭 8 年前。 我知道 RAND_
我的作业涉及生成 0 和 2^30 之间的随机整数。现在,在过去我们了解到 rand() 只返回小于 RAND_MAX 的整数,这小于 UINT_MAX,并且我们可以使用位移来填充 UINT_MAX
这个表达式是如何工作的? Num*rand() / RAND_MAX 例如,如果我用 7.7 替换数字,它会给我从 0. 到 7. 的值(双)。 最佳答案 rand()函数生成 0 之间的整数值和
我想找到一种在 C 中获取随机数的不偏斜的方法(尽管我最多将它用于 0-20 的值,更可能只有 0-8)。我看过这个公式,但在运行了一些测试后,我不确定它是否有偏差。有帮助吗? 这里是使用的完整函数:
我查阅了 C 标准(自 1999 年起),它只说 RAND_MAX 应该至少为 32767,但没有说明这个宏应该扩展为有符号整数还是无符号整数。单一 UNIX 规范(link 1、link 2)和 L
为什么它不是const?我认为这不是一个明确的 C++ 方式。也许有更多的 C++ 方法来生成随机数,是吗? 最佳答案 RAND_MAX 来自 C 标准库,它被定义为一个宏。 在 C 中,宏是定义 l
这与这个问题有关 - random number generation in C++ ... first number not very random #include #include #inc
generate(vec.begin(), vec.end(), [=](){return static_cast(static_cast(ran()) /RAND_MAX*(max-min)+min
我对 C++ 很感兴趣,尽管我怀疑它只是导入了 C 标准定义。我相信标准所说的答案是否定的,但我对实际答案最感兴趣。 如果 RAND_MAX 始终为 (2^n)-1(其中 n 是某个自然数 - 实际上
我试图使用 rand() 生成一些随机数,但我首先检查了 RAND_MAX,因为我想生成一些大数。在 Windows 10 中 printf("%x",RAND_MAX); 给出 0x7fff 而在
当 RAND_MAX 的值为 0.000000。 RAND_MAX 不应该为 rand() 函数生成的数字设置最大值吗? #include #include int mai
我看了很多地方,似乎找不到答案。我明白rand() / RAND_MAX == 1的概率低是因为 rand()不太可能等于 RAND_MAX . 但是理论上可行吗? 我看到有人写类似的东西,范围是 [
我正在阅读 C FAQ并在 question 中找到它建议我使用 rand()/(RAND_MAX/N + 1) 而不是更流行的方式 rand() % N。 这样做的原因是,当 N 是一个小数时,ra
如何生成 0 到 n 范围内的随机数,其中 n 可以是 > RAND_MAX(在 C、C++ 中)? 谢谢。 最佳答案 将生成分成两个阶段,然后组合生成的数字。 关于c++ - 生成 0 到 n 范围
我是一名优秀的程序员,十分优秀!