Browse Source

* 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: trunk@2422 -

Jonas Maebe 19 years ago
parent
commit
1bcde3436d
1 changed files with 9 additions and 1 deletions
  1. 9 1
      rtl/inc/system.inc

+ 9 - 1
rtl/inc/system.inc

@@ -434,12 +434,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;