novi - 1 year ago 108
R Question

# Generate uniform random variable when lower boundary is close to zero

When I run in R

`runif(100,max=0.1, min=1e-10)`

I get 100 uniformly distributed random variables between 0.1 and 0.0001. So, there is no random values between 0.0001 and the min value (
`min=1e-10`
).

How to generate uniform random variables on the whole interval (between min and max values).

(Edited to replace `exp(-10)` with `1e-10`)

Given your max of `0.1` and min of `1e-10`, the probability that any given value is less than 0.1 is given by

``````(1e-4 - 1e-10) / (0.1 - 1e-10) = 9.99999e-04
``````

The probability that 100 random values from this distribution are all greater than `1e-4` is

``````(1 - 9.99999e-04) ^ 100 = 0.90479
``````

About 90.5%. So you shouldn't be at all surprised that in a draw of 100 numbers from this distribution, you didn't see any less than `1e-4`. This is expected more than 90.5% of the time theoretically. We can even verify this in simulation:

``````set.seed(47) # for replicability
# 100,000 times, draw 100 numbers from your uniform distribution
d = replicate(n = 1e5, runif(100, max = 0.1, min = 1e-10))
# what proportion of the 100k draws have no values less than 1e-4?
mean(colSums(d < 1e-4) == 0)
# [1] 0.90557
# 90.56% - very close to our calculated 90.48%
``````

For more precision, we can repeat with even more replications

``````# same thing, 1 million replications
d2 = replicate(n = 1e6, runif(100, max = 0.1, min = 1e-10))
mean(colSums(d2 < 1e-4) == 0)
# [1] 0.90481
``````

So, with 1MM replications, `runif()` is almost exactly meeting expectations. It is off from the expectation by `0.90481 - 0.90479 = 0.00002`. I would say there is absolutely no evidence that `runif` is broken.

We can even plot the histograms for some of the replications. Here are the first 20:

``````par(mfrow = c(4, 5), mar = rep(0.4, 4))
for (i in 1:20) hist(d[, i], main = "", xlab  = "", axes = F)
``````

To get more very low random values, your two choices are (a) draw more numbers from the uniform or (b) change distributions to one that has more weight closer to 0. You could try an exponential distribution? Or maybe, if you want a hard upper bound as well you could scale a beta distribution? Your other choice is to not use random values at all, maybe you want evenly spaced values and `seq` is what you're looking for?

Recommended from our users: Dynamic Network Monitoring from WhatsUp Gold from IPSwitch. Free Download