gpt4 book ai didi

c - INT_MAX 和 INT_MIN 之间的随机数

转载 作者:行者123 更新时间:2023-11-30 21:20:56 25 4
gpt4 key购买 nike

嗯,我觉得我的问题比其他问题更复杂一些。我在尝试解决这个问题时意识到了这一点。

我尝试使用

int number = rand() % (INT_MAX - INT_MIN + 1) + INT_MIN;
rand() % (INT_MAX + INT_MIN + 1) + rand() % INT_MIN;

但是,我遇到了浮点异常 8 错误。没有警告,这真的很奇怪!

此外,在 time.h 中,我每次执行代码时都使用 srand((unsigned)time(NULL)) 作为新的随机数。

但是无论我尝试什么,我都会得到不正确的结果或浮点异常。

我真的很好奇溢出和下溢,它是如何发生的以及这样的随机数真的能产生吗?

我基本上想在 C 中生成一个大于 INT_MIN 且小于 INT_MAX 的数字。

我尝试了很多逻辑,但得到了错误的结果。

最佳答案

(INT_MAX - INT_MIN + 1) 可能会溢出(因为它们是 int 文字)并产生 0,解释你的错误(你除以0)。

更改为 ((long)INT_MAX - INT_MIN + 1) 将避免溢出(假设 long 大于 int,即Windows 上的 Visual Studio 则不然,您需要转换为 long long)。

也就是说,您不会通过一次 rand 调用获得您想要的结果;它只产生 0 到 RAND_MAX 之间的数字; RAND_MAX 通常为 32767,因此您最终只能覆盖大多数系统上 int 可能范围的一小部分(其中 int 是通常为 32 位)。

要实现此目的,您需要生成足够的位来填充 int。像这样的东西:

#include <stdlib.h>
#include <limits.h>
#include <math.h>

/* Assumes srand() has been called with an appropriate seed at some point
Code assumes C99 is available; minor tweaks needed for older compilers.
*/
int gen_random_int() {
const int BITS_PER_RAND = (int)(log2(RAND_MAX/2 + 1) + 1.0); /* Or log(RAND_MAX + 1) / log(2) with older language standards */
int ret = 0;
for (int i = 0; i < sizeof(int) * CHAR_BIT; i += BITS_PER_RAND) {
ret <<= BITS_PER_RAND;
ret |= rand();
}
return ret;
}

您甚至不需要考虑 INT_MININT_MAX,因为这会直接填充 int;随机生成的多余位溢出并被丢弃。

关于c - INT_MAX 和 INT_MIN 之间的随机数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32773855/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com