1

I know that I need to use Math.random() for making random numbers, but today I tried to make a random number between 1 and 9999...(9 repeated 19 times) and my output always ends in 3-5 zeroes. How can I generate more detailed random numbers?

What I've done:

const foo = Math.floor(Math.random() * parseInt("9".repeat(19)));

Also, I'm pretty sure I know how to do this, but if anyone can tell me, how do I pad zeroes to get to a certain digit count? (ex. pad(15,4) becomes 0015 because the you need 2 more digits to make it 4 digits long)

DexieTheSheep
  • 439
  • 1
  • 6
  • 16
  • 7
    The maximum integer you can represent without loss of precision is `2^53 - 1`, which has 16 digits. In other words, you cannot have an integer value derived from a 19 digit long string without loosing precision. Proof: `9007199254740991 + 1 ` and `9007199254740991 + 2` are both `9007199254740992`. Welcome to the world of floating point values. – Felix Kling Jan 28 '19 at 22:53
  • 1
    So, what you may want is `Math.floor(Math.random() * Number.MAX_SAFE_INTEGER);` instead. – Felix Kling Jan 28 '19 at 22:57
  • [`padStart`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/padStart) – Bergi Jan 28 '19 at 22:58

3 Answers3

2

The best idea is probably to just use a string of random integers (solves padding too):

let foo = '';
for(i=0; i<19; ++i) foo += Math.floor(Math.random() * 10);
alert(foo);
drussey
  • 665
  • 4
  • 9
2

You need to use numbers encoded as strings. A loop like this:

var desiredMaxLength = 19
var randomNumber = '';
for (var i = 0; i < desiredMaxLength; i++) {
    randomNumber += Math.floor(Math.random() * 10);
}

Arthimetic for numbers represented as strings can be donw with the strint library found at https://github.com/rauschma/strint.

Charles Goodwin
  • 584
  • 5
  • 8
1

You are running into Number.MAX_SAFE_INTEGER. The largest exact integral value is 2^53-1, or 9007199254740991.

fiddels
  • 74
  • 2