Eh, I&#x27;m not sure where you&#x27;re getting your numbers. Here&#x27;s a quick test using node 0.10.40 on my machine:<p><pre><code>  mmalone$ node
  &gt; var f = function() {
  ... s = Date.now()
  ... for (var i = 0; i &lt; 1000000; i++) {Math.random()}
  ... return Date.now() - s
  ... }
  undefined
  &gt; f()
  3
  &gt; f()
  1
  &gt; f()
  1
  &gt;
</code></pre>
So I&#x27;m getting a couple milliseconds for 1,000,000 numbers. I&#x27;m also toying around with a PRNG package in Go currently so I have some numbers there too:<p><pre><code>  BenchmarkXorshift128p-8                  	500000000	         2.98 ns&#x2F;op
  BenchmarkXorshift1024s-8                 	300000000	         4.62 ns&#x2F;op
  BenchmarkXorshift4096s-8                 	300000000	         4.44 ns&#x2F;op
  BenchmarkXorshift4096ss-8                	200000000	         6.29 ns&#x2F;op
  BenchmarkUint64sFromCryptoRandIdiomatic-8	  200000	     10736 ns&#x2F;op
  BenchmarkUint64sFromCryptoRandUnsafe-8   	  200000	      8081 ns&#x2F;op
</code></pre>
Go&#x27;s crypto source pulls from urandom. This is more like what I&#x27;d expect in terms of performance. The difference is orders of magnitude, but we&#x27;re still talking about microseconds so I think your argument is still valid. A proper CSPRNG is not &quot;as fast&quot; but it is probably &quot;fast enough&quot; for most use cases.