unsigned aa=(rand()*1000)/RAND_MAX+15550;有bug吗?请详细分析。rand...
发布网友
发布时间:2024-08-18 15:37
我来回答
共3个回答
热心网友
时间:2024-08-25 12:53
rand()的范围很小,是16位的无符号整数,所以再乘以1000不会超出unsigned int的范围
这句话的意图应该是要生成15550 ~ 16550之间的数
这样写个近似的就好理解了unsigned aa=(unsigned)(((float)rand()/RAND_MAX)*1000)+15550 由于rand()返回的是整数,直接这么写rand()/RAND_MAX只能得到0,所以要先转化成浮点运算得到一个[0,1)范围内的数,再扩大1000倍,再加上15550。其实这种写法和你的差不多,我做了个实验,*1000的时候两者是等价的。若不是1000,误差有的时候是1,这个我觉得可以忽略不计,本来整数除法就是有误差的。
热心网友
时间:2024-08-25 12:55
如楼下所述通常rand()本身是返回整数,你再乘1000可能越界,后面加的15550也很大,你目的是什么?
请参考:
http://zhidao.baidu.com/question/527823025.html
热心网友
时间:2024-08-25 12:53
原型:int rand( void );
返回值:The rand function returns a pseudorandom integer in the range 0 to RAND_MAX (32767). Use the srand function to seed the pseudorandom-number generator before calling rand.
所以返回是int,1000也是int的,因为你没有用UL作为结尾(1000UL为unsigned的),
所以rand()*1000的最大值是32767000 (0x01F3FC18),所以也没有over flow.
rand()*1000/RAND_MAX的范围是[0,1000].也没有问题,所以aa的范围1000~16,550.也有发生问题。
至于compiler用的中间variable。debug和release不同,不用的compiler结果也不过。还与你的编译选项相关,所以无法回答。