Solved Normalize random() output?
-
Team,
Is it possible to normalize the output of random()?
ie --- I only want to see an output of 8 digits?
For now - I just see varying lengths on the output.Thanks!
-
@ShylerC
It's not really a Qt question, but the answer isn't one either.To force a range on your random generator one usualy goes the following way
outPut = random()%((max- min) + 1) + min;
for 8 digits min is 10000000 and max is 99999999, however due to the nature of this, it will "reduce" the randomness.
-
Thanks,
I was looking at using QRandomGenerator too.
I've gotten them both to output well. Just need to control their range to be purely 8 digits.
Thank you so much!//to illustrate, test function -- QRandomGenerator Class//
int yum;
yum=700;while (yum < 800){
QRandomGenerator::global();
int x = QRandomGenerator::global()->generate64();
yum = yum += 1;
qDebug() << x;
}/to illustrate, test function -- random()//
int yum;
yum=700;while (yum < 800){
yum = yum += 1;
x = random()
qDebug() << x;
} -
outPut = random()%((max- min) + 1) + min;
I realize this is in a sense OT, but I've always been fascinated by (pseudo-) random number generation. You are using MOD (
%
) to restrict your range. My understanding is that this approach comes from The Devil if the range is "large" compared to random number return size.Random numbers have a random distribution of 0s and 1s in each bit. Suppose the random number generator returns an 8 bit number, 0 to 255. Suppose your range is 250, 0 to 249, so you use
% 250
. Most numbers will occur once, being equally likely. But for generated random numbers 250 to 255 inclusive, the MOD will return a number 0 to 5 inclusive. So 0 to 5 come out twice as likely to be returned compared to any other number!Any comments?
-
@JonB
yep, that's about right, and the cause for my tagged comment aboutit will "reduce" the randomness.
-
@J.Hilk
:) Is there a suggested algorithm somewhere for generating "truly" random numbers within a range, e.g. as per the case above, generalized for a ranger
? I can think of: if the random number is greater equal 250 throw it away and draw again, but obviously this does not scale well efficiency-wise....! -
@JonB said in Normalize random() output?:
@J.Hilk
:) Is there a suggested algorithm somewhere for generating "truly" random numbers within a range, e.g. as per the case above, generalized for a ranger
? I can think of: if the random number is greater equal 250 throw it away and draw again, but obviously this does not scale well efficiency-wise....!Thats a tough question.
if your target range is 0-3, 0-7, 0-15, 0-31, 0-63, 0-127, 69-127 etc , you could do some bit shifting/setting, but after that it gets complicated. I would suggest looking into boost libary or something like that those guys usually have some nifty solutions for such problems :)
-
Scale and shift (for generation between 0 and
generatorMax
):int randomNumber, generatorMax; int max, min; //< Range int scaledNumber = min + static_cast<double>(randomNumber) / generatorMax * (max - min);
PS. One should probably round at the end, instead of truncating, but I forgot x_x.