好吧,我觉得我的问题比其他问题要复杂一些。
我在尝试解决时意识到了这一点。
我尝试使用
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,这通常是INT_MAX - INT_MIN + 1
-> 0
的结果,尽管未指定。rand()
生成一个在int
范围内的[0...RAND_MAX]
。从RAND_MAX <= INT_MAX
开始,可能需要多次调用才能在int
范围内构造[0...INT_MAX]
,更不用说您对[INT_MIN...INT_MAX]
的追求了。
下面是一种通用方法。它不是高效的,而是简单的,显然可以对各种类型进行修改。
int rand_int(void) {
union {
int i;
unsigned char uc[sizeof (int)];
} u;
for (size_t i = 0; i < sizeof u.uc; i++) {
u.uc[i] = rand();
}
return u.i;
}
从技术上讲,它可以在陷阱值为
int
的罕见机器上导致UB。