回 帖 发 新 帖 刷新版面

主题:[花絮帖]诡异的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个小时......希望大家不要重蹈我的覆辙了......-_-

回复列表 (共4个回复)

沙发

真没想到大名鼎鼎的斑竹也会被一个小问题困扰啊!

很简单就能解决了。

s:=RANDOM(3)
t:=s-1

板凳

先放上一个本人编的超级小蜜蜂:
http://upload.programfan.com/upfile/200707200945682.rar 

注意源程序的703行,有一句是:
flags:=random(2)*2-1;
random(2)*2-1的取值为-1或1,按斑竹的理论的说应该是会出现:Error 215:Arithmetic Overflow
但是我编译了那么多次,怎么没有一次是出现Error 215的?

3 楼

谢了,大鸟

4 楼

[quote]真没想到大名鼎鼎的斑竹也会被一个小问题困扰啊!

很简单就能解决了。

s:=RANDOM(3)
t:=s-1[/quote]

困扰我的不是问题本身(s:=1-random(3);就解决了), 而是为何会出现这个问题。

我来回复

您尚未登录,请登录后再回复。点此登录或注册