diff --git a/src/types/array.js b/src/types/array.js
index 96efb1184b7ce78defcb0d7fc8122413bb39c08f..cd5f6a3a3c8571b0ca5f11e43f52667ce01883cd 100644
--- a/src/types/array.js
+++ b/src/types/array.js
@@ -82,8 +82,8 @@ function arrayType(value, path, resolve, traverseCallback) {
 
   if (optionalsProbability !== false) {
     length = fixedProbabilities
-      ? Math.round(maxItems * optionalsProbability)
-      : random.number(minItems, maxItems) * optionalsProbability;
+      ? Math.round((maxItems || length) * optionalsProbability)
+      : Math.abs(random.number(minItems, maxItems) * optionalsProbability);
   }
 
   // TODO below looks bad. Should additionalItems be copied as-is?