|
|
************* ************* ************** ** ***** *********** ******* ************ ************* ********** |
|
|
********** ********** ********* ********** ********** ********* ********* ********* ********* ********** |
Geckoo wrote: |
---|
May I say that with a very big amount of processes (x billions) I could have a really flat output ? |
|
|
LLN test with 100 coins Heads -> 53 Tails -> 47 Dispersion % : 12.766 LLN test with 10000 coins Heads -> 5022 Tails -> 4978 Dispersion % : 0.883889 LLN test with 1000000 coins Heads -> 500246 Tails -> 499754 Dispersion % : 0.0984484 |
|
|
As you can understand, it generates a random number (Mersenne Twister 19937 generator) between two integers which I set in as a pair. It works as expected - and when "I throw my dice" 100 times, I have a real randomized output which I display this way showing numbers occurrences for 100 generations :
|
10.0
:
|
|
Means after 1 samples: means[0] = 10.0000 means[1] = 6.0000 means[2] = 10.0000 means[3] = 7.0000 means[4] = 10.0000 means[5] = 8.0000 means[6] = 14.0000 means[7] = 14.0000 means[8] = 14.0000 means[9] = 7.0000 Means after 999984 samples: means[0] = 9.9994 means[1] = 10.0041 means[2] = 9.9965 means[3] = 9.9978 means[4] = 9.9996 means[5] = 9.9962 means[6] = 10.0023 means[7] = 10.0016 means[8] = 10.0008 means[9] = 10.0018 [...] Means after 2372959660 samples: means[0] = 9.9999 means[1] = 9.9999 means[2] = 10.0000 means[3] = 10.0000 means[4] = 10.0001 means[5] = 10.0000 means[6] = 9.9999 means[7] = 10.0001 means[8] = 10.0000 means[9] = 10.0000 |
100 / 10 = 10
George P wrote: |
---|
use the same seed and you get the same sequence of numbers |
George P wrote: |
---|
C++ has an embarrassment of riches for generating random numbers. |
|
|
Pseudo random Generator Number : 2 Number : 10 Number : 8 Number : 3 Number : 1 Number : 6 Number : 3 Number : 7 Number : 0 Number : 0 |
UINT32_MAX
(or UINT64_MAX
), then using the modulo function (%
) to map those numbers to the 0 to N-1
range is fine – as long a N is significantly smaller than UINT32_MAX
.UINT32_MAX
, and if UINT32_MAX
is not an exact multiple of N, then there will be a certain "bias", yes. But, again, as long as your N is significantly smaller than UINT32_MAX
, you don't have to worry about the bias, as the bias would be negligible.pseudo_rand()
give the exactly same result, because the clock has not advanced in between these calls! Keep in mind that the clock has a limited resolution and only "ticks" every so often!
|
|
|
|
kigar64551 wrote: |
---|
Your problem here is a different one: The clock (seconds elapsed since "epoch") is not even close to being a "random" source !!! |
|
|
Number : 460923 Number : 479778 Number : 484588 Number : 488453 Number : 491815 Number : 496048 Number : 500407 Number : 504606 Number : 508759 Number : 513074 |
Number : 633083 Number : 649724 Number : 651975 Number : 653616 Number : 655477 Number : 657054 Number : 658610 Number : 659978 Number : 662026 Number : 663529 |
Number : 969272 Number : 987384 Number : 989496 Number : 990778 Number : 992479 Number : 993877 Number : 995210 Number : 996550 Number : 997887 Number : 999910 |
rand() % N
would work a lot better than your time_since_epoch().count() % N
😏