Re: How to generate random number between two numbers
Sanchit wrote:
I want to generate a randowm number between two numbers x and y i.e
>
int randomNoBetween (int x, int y);
The (I guess) simplest way to get a random number in the interval [0, n)
(that is, 0 inclusive, n exclusive) is (if n is small enough) probably
(rand() % n), which will however slightly favor smaller numbers.
I can't tell if there's any "consensus" on whether to use this method or
some more expensive (like floating point arithmetic) to do this.
With this method, it is trivial to write your function in question; this
is left as an exercise to you ;)
Daniel
--
Done: Arc-Bar-Cav-Rog-Sam-Val-Wiz
To go: Hea-Kni-Mon-Pri-Ran-Tou
Re: How to generate random number between two numbers
On Sep 29, 2:43 pm, Daniel Kraft <d...@domob.euw rote:
Sanchit wrote:
I want to generate a randowm number between two numbers x and y i.e
>
int randomNoBetween (int x, int y);
See question 13.16 of the C-FAQ.
<http://c-faq.com/>
The (I guess) simplest way to get a random number in the interval [0, n)
(that is, 0 inclusive, n exclusive) is (if n is small enough) probably
(rand() % n), which will however slightly favor smaller numbers.
Yes, see question 13.18 of the aforementioned FAQ to learn why.
Re: How to generate random number between two numbers
On Sep 29, 7:43 am, Daniel Kraft <d...@domob.euw rote:
Sanchit wrote:
I want to generate a randowm number between two numbers x and y i.e
>
int randomNoBetween (int x, int y);
>
The (I guess) simplest way to get a random number in the interval [0, n)
(that is, 0 inclusive, n exclusive) is (if n is small enough) probably
(rand() % n), which will however slightly favor smaller numbers.
>
You can eliminate the bias by computing the largest multiple of
RAND_MAX that's evenly divisible by n. Call this M. Then just throw
away random numbers until you get one in the range 0 to M-1. Call
this R. Then return R % n.
Re: How to generate random number between two numbers
>I want to generate a randowm number between two numbers x and y i.e
Generating random numbers requires specialized hardware. Do you
want pseudo-random numbers instead? There's a big difference,
especially to those using cryptography.
>
>int randomNoBetween (int x, int y);
>
>Plz help
>Is there any such function??
Generally, you can take whatever pseudo-random number generator you
have that generates numbers in a range you can't control, and use
algebra to transform that range into the one you want. Sometimes
this will result in inaccurate probability distribution.
Re: How to generate random number between two numbers
On Sep 29, 11:36 pm, gor...@hammy.bu rditt.org (Gordon Burditt) wrote:
I want to generate a randowm number between two numbers x and y i.e
>
Generating random numbers requires specialized hardware. Do you
want pseudo-random numbers instead? There's a big difference,
especially to those using cryptography.
>
>
>
int randomNoBetween (int x, int y);
>
Plz help
Is there any such function??
>
Generally, you can take whatever pseudo-random number generator you
have that generates numbers in a range you can't control, and use
algebra to transform that range into the one you want. Sometimes
this will result in inaccurate probability distribution.
>Generally, you can take whatever pseudo-random number generator you
>have that generates numbers in a range you can't control, and use
>algebra to transform that range into the one you want. Sometimes
>this will result in inaccurate probability distribution.
>
I have to generate a pseudo random number
You *have* to? Why?
Did you have a question beyond what you asked originally? Did the
extensive discussion and references in this thread not answer your
question?
--
Keith Thompson (The_Other_Keit h) kst-u@mib.org <http://www.ghoti.net/~kst>
Nokia
"We must do something. This is something. Therefore, we must do this."
-- Antony Jay and Jonathan Lynn, "Yes Minister"
Re: How to generate random number between two numbers
"Bartc" <bc@freeuk.comw rites:
"Sanchit" <sanchitgupta.1 @gmail.comwrote in message
news:3936044e-dd56-4aea-883e-320c5dcf1422@n3 8g2000prl.googl egroups.com...
>>I want to generate a randowm number between two numbers x and y i.e
>>
>int randomNoBetween (int x, int y);
>
Given a function random() which generates a (necessarily)
pseudo-random integer with enough bits for your purpose:
>
/* Return random number from x to y inclusive */
int randomNoBetween (int x, int y) {
return (random() %(y-x+1))+x;
}
>
You will have to find your own random(); I just use something like this:
>
#include <stdlib.h>
>
int random() {
return (rand()<<15) | rand();
}
Eek! The general advice is to leave a PRNG alone unless you know it
has a fault and your fix is correct for it. I've seen more problems
caused by "fixed" PRNGs than by intrinsically bad ones.
The above is not a good idea. It has probable undefined behaviour (on
most systems) and will produce badly biased results if RAND_MAX is not
65535.
Re: How to generate random number between two numbers
"Ben Bacarisse" <ben.usenet@bsb .me.ukwrote in message
news:87od21bz42 .fsf@bsb.me.uk. ..
"Bartc" <bc@freeuk.comw rites:
>You will have to find your own random(); I just use something like this:
>>
>#include <stdlib.h>
>>
>int random() {
>return (rand()<<15) | rand();
>}
>
Eek! The general advice is to leave a PRNG alone unless you know it
has a fault and your fix is correct for it. I've seen more problems
caused by "fixed" PRNGs than by intrinsically bad ones.
>
The above is not a good idea. It has probable undefined behaviour (on
most systems) and will produce badly biased results if RAND_MAX is not
65535.
Last check I checked, rand() only returned a 15-bit result. And just quickly
checking again the 3 compilers I use, they are still all 15-bits.
Still, perhaps that second rand() can be &-ed with 32767 just in case.
Re: How to generate random number between two numbers
"Bartc" <bc@freeuk.comw rites:
"Ben Bacarisse" <ben.usenet@bsb .me.ukwrote in message
news:87od21bz42 .fsf@bsb.me.uk. ..
>"Bartc" <bc@freeuk.comw rites:
>
>>You will have to find your own random(); I just use something like this:
>>>
>>#include <stdlib.h>
>>>
>>int random() {
>>return (rand()<<15) | rand();
>>}
>>
>Eek! The general advice is to leave a PRNG alone unless you know it
>has a fault and your fix is correct for it. I've seen more problems
>caused by "fixed" PRNGs than by intrinsically bad ones.
>>
>The above is not a good idea. It has probable undefined behaviour (on
>most systems) and will produce badly biased results if RAND_MAX is not
>65535.
Correction to self: I meant 32767 and I think you got that.
Last check I checked, rand() only returned a 15-bit result. And just
quickly checking again the 3 compilers I use, they are still all
15-bits.
That does not mean the advice is good. Just say: "with my C lib
RAND_MAX is 32767 so I do..." and you won't get a comment (except the
one below). It looked like general advice and as such it us unwise.
Still, perhaps that second rand() can be &-ed with 32767 just in
case.
I would not do that. If the & is needed to avoid the bias of
overlapping bits then the whole construct is ill-advised.
A RAND_MAX of 32767 is too low.
I agree, but halving the period of a bad PRNG in exchange for doubling
the bits per call is not always a good idea. It may be worth it in
your case (I have no idea why you are doing it) but, again, it is not
really sound advice /in general/.
Re: How to generate random number between two numbers
In article <87fxndbwe3.fsf @bsb.me.uk>,
Ben Bacarisse <ben.usenet@bsb .me.ukwrote:
>Still, perhaps that second rand() can be &-ed with 32767 just in
>case.
>I would not do that. If the & is needed to avoid the bias of
>overlapping bits then the whole construct is ill-advised.
I disagree. If you have a source that provides at least 15 random
bits (which, modulo poor quality of implementation, rand() is
required to do), and you need some larger number of random bits,
then sticking together chunks of 15 bits is a reasonable approach.
You could be more sophisticated and examine RAND_MAX to see how many
bits you get, but it would be somewhat tedious especially as I don't
think it's guaranteed that RAND_MAX is of the form 2^n-1.
-- Richard
--
Please remember to mention me / in tapes you leave behind.
Re: How to generate random number between two numbers
"Bartc" <bc@freeuk.comw rites:
"Ben Bacarisse" <ben.usenet@bsb .me.ukwrote in message
news:87od21bz42 .fsf@bsb.me.uk. ..
>"Bartc" <bc@freeuk.comw rites:
>>You will have to find your own random(); I just use something like this:
>>>
>>#include <stdlib.h>
>>>
>>int random() {
>>return (rand()<<15) | rand();
>>}
>>
>Eek! The general advice is to leave a PRNG alone unless you know it
>has a fault and your fix is correct for it. I've seen more problems
>caused by "fixed" PRNGs than by intrinsically bad ones.
>>
>The above is not a good idea. It has probable undefined behaviour (on
>most systems) and will produce badly biased results if RAND_MAX is not
>65535.
>
Last check I checked, rand() only returned a 15-bit result. And just
quickly checking again the 3 compilers I use, they are still all
15-bits.
RAND_MAX must be at least 32767 (and at most INT_MAX). It's
2147483647 on two systems I just tried. (BTW, RAND_MAX is an
attribute of the runtime library, not of the compiler.)
Still, perhaps that second rand() can be &-ed with 32767 just in case.
>
A RAND_MAX of 32767 is too low.
If you mean it's too low for your purposes, I won't disagree, but it's
allowed by the standard.
Your random() function (note that there's a POSIX function by that
name, so you might want to pick something else), with the "&32767"
added, produces 30 bits of randomness. You might consider checking
whether RAND_MAX is big enough, and if so, just call rand() once:
--
Keith Thompson (The_Other_Keit h) kst-u@mib.org <http://www.ghoti.net/~kst>
Nokia
"We must do something. This is something. Therefore, we must do this."
-- Antony Jay and Jonathan Lynn, "Yes Minister"
In article <87fxndbwe3.fsf @bsb.me.uk>,
Ben Bacarisse <ben.usenet@bsb .me.ukwrote:
>
>>Still, perhaps that second rand() can be &-ed with 32767 just in
>>case.
>
>>I would not do that. If the & is needed to avoid the bias of
>>overlapping bits then the whole construct is ill-advised.
>
I disagree. If you have a source that provides at least 15 random
bits (which, modulo poor quality of implementation, rand() is
required to do), and you need some larger number of random bits,
then sticking together chunks of 15 bits is a reasonable approach.
Oh sure. If you need more bits then shifting, masking and or-ing is
fine. It was the idea that bunging in a mask would fix the specific
code that prompted my comment. If the mask is needed then the code is
in danger of producing UB.
You could be more sophisticated and examine RAND_MAX to see how many
bits you get, but it would be somewhat tedious especially as I don't
think it's guaranteed that RAND_MAX is of the form 2^n-1.
No, but if you don't inspect RAND_MAX and make the code depend on it
in some way you are in danger of shifting too much.
Comment