瀏覽代碼

Merged revisions 2422 via svnmerge from
svn+ssh://[email protected]/FPC/svn/fpc/trunk

r2422 (jonas)
* random(int64(0)) now return 0 instead of division by zero
* random(negative_longint) now returns values between -l+1 and 0
instead of between -l and 0

git-svn-id: branches/fixes_2_0@2424 -

Jonas Maebe 19 年之前
父節點
當前提交
55592958c3
共有 1 個文件被更改,包括 9 次插入1 次删除
  1. 9 1
      rtl/inc/system.inc

+ 9 - 1
rtl/inc/system.inc

@@ -426,12 +426,20 @@ end;
 
 function random(l:longint): longint;
 begin
+  { otherwise we can return values = l (JM) }
+  if (l < 0) then
+    inc(l);
   random := longint((int64(cardinal(genrand_MT19937))*l) shr 32);
 end;
 
 function random(l:int64): int64;
 begin
-  random := int64((qword(cardinal(genrand_MT19937)) or ((qword(cardinal(genrand_MT19937)) shl 32))) and $7fffffffffffffff) mod l;
+  { always call random, so the random generator cycles (TP-compatible) (JM) }
+  random := int64((qword(cardinal(genrand_MT19937)) or ((qword(cardinal(genrand_MT19937)) shl 32))) and $7fffffffffffffff);
+  if (l<>0) then
+    random := random mod l
+  else
+    random := 0;
 end;
 
 function random: extended;