How to generate random number between two numbers

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • Sanchit

    How to generate random number between two numbers

    I want to generate a randowm number between two numbers x and y i.e

    int randomNoBetween (int x, int y);

    Plz help
    Is there any such function??
  • Daniel Kraft

    #2
    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

    Comment

    • vippstar@gmail.com

      #3
      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.

      Comment

      • Gene

        #4
        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.

        Comment

        • Gordon Burditt

          #5
          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.

          Comment

          • Sanchit

            #6
            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.
            I have to generate a pseudo random number

            Comment

            • Keith Thompson

              #7
              Re: How to generate random number between two numbers

              Sanchit <sanchitgupta.1 @gmail.comwrite s:
              On Sep 29, 11:36 pm, gor...@hammy.bu rditt.org (Gordon "rude" Burditt) wrote:
              [...]
              >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"

              Comment

              • Nick Keighley

                #8
                Re: How to generate random number between two numbers

                On 2 Oct, 07:19, Sanchit <sanchitgupt... @gmail.comwrote :
                I have to generate a pseudo random number
                rand()

                --
                Nick Keighley

                Comment

                • Bartc

                  #9
                  Re: How to generate random number between two numbers


                  "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();
                  }

                  --
                  Bartc

                  Comment

                  • Ben Bacarisse

                    #10
                    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.

                    --
                    Ben.

                    Comment

                    • Bartc

                      #11
                      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.

                      A RAND_MAX of 32767 is too low.

                      --
                      Bartc

                      Comment

                      • Ben Bacarisse

                        #12
                        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/.

                        --
                        Ben.

                        Comment

                        • Richard Tobin

                          #13
                          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.

                          Comment

                          • Keith Thompson

                            #14
                            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:

                            int rand30(void)
                            {
                            #define BITS15 0x7fff
                            #define BITS30 0x3fffffff
                            #if RAND_MAX >= BITS30
                            return rand() & BITS30;
                            #else
                            return (rand() & BITS15) << 15 | (rand() & BITS15);
                            #endif
                            }

                            --
                            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"

                            Comment

                            • Ben Bacarisse

                              #15
                              Re: How to generate random number between two numbers

                              richard@cogsci. ed.ac.uk (Richard Tobin) writes:
                              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.

                              --
                              Ben.

                              Comment

                              Working...