How to generate random numbers in a very large range via javascript?
javascript, largenumber, random
Solution
The answer in general is don't use Math.random. It gets the job done, but it's not especially good. On top of that, any number in Javascript greater than 0xffffffffUL isn't represented by integer values--it's an IEEE 754 value with a behavior noted on the MDN site: "Note that as numbers in JavaScript are IEEE 754 floating point numbers with round-to-nearest-even behavior...."
And that's what you're seeing.
If you want larger random numbers, then you'll probably have to get something like Mersenne Twister or Blum-Blum-Shub 32-bit random integer values and multiply them. That will eliminate the rounding-off problem.
Problem
I was using this function for a long time and was happy with it. You probably saw it millions of times. It is even in the example section of the MDN documentation for Math.random()! ``` function random(min, max) { return Math.floor(Math.random() * (max - min + 1)) + min }; ``` However when I called it on really large range it performed really poorly. Here are some results: ``` for(var i=0;i<100;i++) { console.log(random(0, 34359738368)) } 34064924616 6800671568 30945277424 2591785504 16404206304 29609031808 14821448928 10712020504 26471102024 21454653384 33180253592 28189739360 27189739528 1159593656 24058421888 13727549496 21995862272 20907450968 28767901872 8055552544 2856286816 28137132160 22775692392 21141911808 16418994064 28151646560 19928528408 11100796192 24022825648 17873139800 10310184976 7425284936 27043756016 2521657024 2864339728 8080550424 8812058632 8867252312 18571554760 19600873680 33687248280 14707542936 28864740112 26338252144 7877957776 28207487968 2268429496 14461565136 28062983608 5637084472 29651319832 31910601904 19776200528 16996597392 2478335752 4751145704 24803500872 21899551216 23144535632 19854787112 8490486080 14932659320 8625736560 11379900040 32357265704 33852039680 2826278800 4648275784 27363699728 14164020752 22279817656 25238815424 16569505656 30065335928 9904863008 26944796040 23179908064 19887944032 27944730648 16242926184 6518696400 25727832240 7496221976 19014687568 5685988776 34324757344 12538943128 21639530152 9532790800 25800487608 34329978920 10871183016 23748271688 23826614456 11774681408 667541072 1316689640 4539806456 2323113432 7782744448 ``` Hardly random at all. All numbers are even. My question is this: What is the CANONICAL way (if any) to overcome this problem? I have the impression that the above random function is the go-to function for random numbers in range. Thanks in advance.