Question:
Write a single statement that chooses a random number from each of the following sets:
a) 2,4,6,8,10
b) 3,5,7,9,11
c) 6,10,14,18,22

I wrote the following statement for the set (a):

(1 + (rand() % 5)) * 2;

but I am unable to write ones for sets (b) and (c). Can someone please give me some hint about how to choose random numbers from these sets using a single statement??

I was able to do this using a switch selection structure but in in a single statement.

Dani AI

Generated

Nice pattern-spotting by and . All three sets are arithmetic progressions, so you can pick a random index in [0,4] and map it with base + step * index. That keeps it to a single expression and stays uniform over the five choices.

int a = 2 + 2 * (std::rand() % 5);  // {2,4,6,8,10}
int b = 3 + 2 * (std::rand() % 5);  // {3,5,7,9,11}
int c = 6 + 4 * (std::rand() % 5);  // {6,10,14,18,22}

Practical tips:

  • Seed once at program start or you will get the same sequence each run:

    std::srand(static_cast<unsigned>(std::time(nullptr)));
  • rand() % n is simple, but note that if RAND_MAX+1 is not a multiple of n, the distribution is slightly biased. With n = 5 this bias is small but not zero. If you want rock-solid uniformity (and better randomness), use C++11 <random>:

static std::mt19937 rng(std::random_device{}());
int a = 2 + 2 * std::uniform_int_distribution<int>(0,4)(rng);

For non-uniform or non-AP sets, index into a container in one statement:

static const int S[] = {3,5,7,9,11};
int pick = S[std::rand() % 5];

The key takeaway from the thread: once you express the set as an arithmetic progression, the single-statement solution drops out naturally. The array-index trick covers everything else.

Recommended Answers

All 4 Replies

For b) what about

((1 + (rand() % 5)) * 2)+1;

Hint:
Each element in {3,5,7,9,11} is the corresponding element in {2,4,6,8,10} plus one.
Each element in {6,10,14,18,22} is the corresponding element in {3,5,7,9,11} multiplied by two.

For b) what about

((1 + (rand() % 5)) * 2)+1;

oh .. yes .. it works Thank you very much!!!

Now I am able to get the statement for the c) too. that is just multiply the statement of b) with 2. i.e.

(((1 + (rand() % 5)) * 2)+1) * 2;

Once again Thanks :)

Hint:
Each element in {3,5,7,9,11} is the corresponding element in {2,4,6,8,10} plus one.
Each element in {6,10,14,18,22} is the corresponding element in {3,5,7,9,11} multiplied by two.

Yes exactly. Thank you very much for the help!! I got it from the post of frogboy77. I wonder why I couldn't guess it myself!!

Be a part of the DaniWeb community

We're a friendly, industry-focused community of developers, IT pros, digital marketers, and technology enthusiasts meeting, networking, learning, and sharing knowledge.