2
$\begingroup$

I saw this as a question on glassdoor and I've seen similar questions elsewhere. Can someone explain the intuition of how to solve a problem like this? There are two scenarios

  1. The uniform RVs in question are discrete
  2. The uniform RVs in question are continuous

For the continuous case, my intuition is: say $X\sim Uniform[1,5] $, then $y = \frac{x-1}{5-1}*(7-1)+1\sim Uniform[1,7]$

Not sure if this is right. And not sure how to do the discrete case.

$\endgroup$
1

2 Answers 2

1
$\begingroup$

For the continuous case, I think you have it. For the discrete case, maybe something like this. It does the job, but 'wastes' random numbers.

(a) Invoke the generator for 5;

(b) invoke it again and add 6 to each result;

(c) concatenate to get discrete uniform sample on integers 1 through 10;

(d) reject values above 7.

In R, the function sample can be used as a discrete uniform generator:

set.seed(912)
x = sample(1:5, 1000, rep=T)              # (a)
y = sample(1:5, 1000, rep=T) + 5          # (b)
t = c(x, y)                               # (c)
table(t)
t
  1   2   3   4   5   6   7   8   9  10 
222 186 191 205 196 211 223 183 168 215 
z = t[t <= 7]
table(z)                                  # (d)
z
  1   2   3   4   5   6   7 
222 186 191 205 196 211 223 
length(z)
[1] 1434                       # yield: sample of size 1434
chisq.test(tabulate(z))        # passes chi-sq test for uniformity

        Chi-squared test for given probabilities

data:  tabulate(z)
X-squared = 6.2817, df = 6, p-value = 0.3924

If you need specifically $n = 1000$ values:

u = sample(z)                  # scramble order
v = u[1:1000]                  # keep first 1000
length(v)
[1] 1000

table(v)                       
v
  1   2   3   4   5   6   7 
155 123 137 132 139 154 160 

chisq.test(tabulate(v))       # sample of 1000 passes chi-sq test

        Chi-squared test for given probabilities

data:  tabulate(v)
X-squared = 7.888, df = 6, p-value = 0.2464

Note: Another discrete generator in R would be as follows:

a = floor(runif(1000, 1, 6))
table(a)
a
  1   2   3   4   5 
212 214 200 185 189 
$\endgroup$
2
  • 1
    $\begingroup$ It is not clear how you get to a uniform variable between 1 and 10. It seems like you generate two variables. One from 1-5 and another from 6-10. $\endgroup$ Sep 12, 2019 at 8:46
  • $\begingroup$ @MartijnWeterings. I see your point. Any slight bias is considerably decreased by scrambling and rejecting to get exactly 1000. You could take $B \sim BINOM(2000,1/2)$ from 1-5 and the rest from 6-10. // Do you have something more elegant in mind? $\endgroup$
    – BruceET
    Sep 12, 2019 at 8:57
1
$\begingroup$

When you invoke the generator twice then you can generate a random number between 1 and 25. You can use the numbers 1 to 21 to generate your random number from 1 to 7 (use modulo 7), and when you roll 22-25 then you have to try again.

Use the answers from Brain teaser: How to generate 7 integers with equal probability using a biased coin that has a pr(head) = p? to perfect it, that means reduce that loss for the rolls between 22-25. How you have to do this depends on the actual purpose of the random number generator (which changes the costs/benefits). but actually this is a game question, and it would not occur much in real world situations (anyway the rules are not well specified)

$\endgroup$

Not the answer you're looking for? Browse other questions tagged or ask your own question.