I have a combinatorics problem for which I want to be able to pick an integer at random between 0 and a big integer.
Now for regular integers I would usually write something like int rand 500;
and be done with it.
But for big integers, it looks like rand
isn't meant for this.
Using the following code, I ran a simulation of 2 million calls to rand $bigint
:
$ perl -Mbigint -E 'say int rand 1230138339199329632554990773929330319360000000 for 1 .. 2e6' > rand.txt
The distribution of the resultant set is far from desirable:
So the process was never able to choose a number like 999
, or 5e+020
, which makes this approach unsuitable for what I want to do.
It looks like this has something to do with the arbitrary precision of rand
, which never goes beyond 15 digits in the course of my testing:
$ perl -E 'printf "%.66g", rand'
0.307037353515625
My initial thought is that maybe there is a way to influence the precision of rand
, but it feels like a band-aid to a much bigger problem (i.e. the inability of rand
to handle big integers).
In any case, I'm hoping someone has walked down this path before and knows how to remedy the situation.
random() method what generates a floating point random number from 0 to 1. In order to restrict it, you need to do something like this: var low:Number = 1; var high:Number= 100; var result:Number = Math.
To generate random numbers in C#, use the Next(minValue, MaxValue) method. The parameters are used to set the minimum and maximum values. Next(100,200); We have set the above method under Random() object.
(Converted from my comment)
A more theoretical-driven approach would be using multiple calls to the PRNG to create enough random-bits for your number to sample. Care has to be taken, if the number of bits produced by some PRNG is not equal to the number of bits needed as outlined below!
n_needed_bits
n_bits_prng
needed_prng_samples = ceil(n_needed_bits / n_bits_prng)
needed_prng_samples
(calls to PRNG) times & concatenate all the bits obtainedn_possible-sample-numbers-of-full-concatenation / n_possible-sample-numbers-within-range
The bins are not the same size. Each bin is 10 times the size of the previous one. To put this in perspective, there are 10,000 possible integers at magnitude 1e+44
for every integer with magnitude 1e+40
.
The probability of finding any number with magnitude 1e+20
for the bigint at 1e+45
is less than 0.00000 00000 00000 00000 001 %
.
Forget needles in haystacks, this is more like finding a needle in a quasar!
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With