主题:[花絮帖]诡异的random(3)-1
如果你用的是TP,那么这个现象是一定会出现的,在FP下我没试过, 不知道会怎样
这个程序:
program lx;
var
i,n:integer;
begin
randomize;
for i:=1 to 10 do n:=random(3)-1;
end.
编译运行, 出现错误: Error 215:Arithmetic Overflow, 溢出了......
很明显, random(3)的取值只能是0,1,2,那么random(3)-1就是-1,0,1,怎么看也不会出现溢出现象......
那么这是为什么呢?
看一下Help, random函数是这样定义的:
Function Random[(Range: [color=red]Word[/color])]:<Sametype as Parameter>;
在这个定义里, 参数Range的默认类型居然是word......而且返回值的类型和Range一样.
真相大白了...random(3)的返回值是个word, 当random(3)返回的是0时, random(3)-1就会变成-1, 而word类型的范围是0..65535, 所以就会出问题.
要对付这个问题, 把程序里的这一句改成这样:
for i:=1 to 10 do n:=integer(random(3))-1;
哎.....这个问题困扰了我2个小时......希望大家不要重蹈我的覆辙了......-_-
这个程序:
program lx;
var
i,n:integer;
begin
randomize;
for i:=1 to 10 do n:=random(3)-1;
end.
编译运行, 出现错误: Error 215:Arithmetic Overflow, 溢出了......
很明显, random(3)的取值只能是0,1,2,那么random(3)-1就是-1,0,1,怎么看也不会出现溢出现象......
那么这是为什么呢?
看一下Help, random函数是这样定义的:
Function Random[(Range: [color=red]Word[/color])]:<Sametype as Parameter>;
在这个定义里, 参数Range的默认类型居然是word......而且返回值的类型和Range一样.
真相大白了...random(3)的返回值是个word, 当random(3)返回的是0时, random(3)-1就会变成-1, 而word类型的范围是0..65535, 所以就会出问题.
要对付这个问题, 把程序里的这一句改成这样:
for i:=1 to 10 do n:=integer(random(3))-1;
哎.....这个问题困扰了我2个小时......希望大家不要重蹈我的覆辙了......-_-