In this particular case there's a simple, easy, completely general method.
Break the problem down into two parts:
Generate random variances $\sigma_i^2,$ $i=1,2,3.$ These define a diagonal matrix $\Sigma = \pmatrix{\sigma_1&0&0\\0&\sigma_2&0\\0&0&\sigma_3}.$
Generate a random correlation matrix $R = \pmatrix{1&\rho_3&\rho_2\\\rho_3&1&\rho_1\\\rho_2&\rho_1&1}.$
The resulting random covariance is $\Sigma R \Sigma.$ It is symmetric by construction. It will be positive-definite if and only if $R$ is, which is equivalent to $|\rho_3|\le 1,$ $|\rho_2|\le 1,$ and $R$ has positive determinant.
What happens if you generate $(\rho_1,\rho_2,\rho_3)$ using any distribution you like supported on the cube $[0.7,0.9]^3$? The only condition you need to check concerns the determinant. But since
$$\det R = 1 - (\rho_1^2+\rho_2^2+\rho_3^2) + 2\rho_1\rho_2\rho_3,$$
we may do a little bit of Calculus and establish that the minimum value of the determinant is attained when one of the $\rho_i$ equals $0.7$ and the other two equal $0.9,$ with a value of $24/1000\gt 0.$ Consequently
no matter how $\rho_1, \rho_2, \rho_3$ are generated, $\det R$ is always positive. Therefore, provided the $\sigma_i$ are positive, $\Sigma R \Sigma$ is a positive-definite covariance matrix.
As an example, you could generate the $\sigma_i^2$ independently with (say) some Gamma distribution and generate the $\rho_i$ uniformly. I created $100,000$ such covariance matrices this way; it took less than two seconds. Here's a summary of the results on which are superimposed the intended distribution density functions, showing the method works as intended.
It is clear that
When $\sigma_1, \ldots, \rho_3$ are drawn from any six-dimensional distribution supported on $(0,\infty)^3\times (0.7,0.9)^3,$ $\Sigma R \Sigma$ is a valid covariance matrix with all correlations between $0.7$ and $0.9.$ Conversely, any distribution of covariance matrices with these properties determines such a distribution of $\sigma_1, \ldots, \rho_3.$
You can even introduce dependencies between the $\sigma_i$ and the $\rho_j$ if you like.
This is the R
code to reproduce the figure. rcov
generates an array of n
such covariance matrices (referenced by a third index).
rcov <- function(n=1, shape=1, rate=1) {
sigma <- matrix(rgamma(3*n, shape, rate), 3)
rho <- matrix(runif(3*n, 0.7, 0.9), 3)
array(sapply(1:n, function(i) {
diag(sigma[,i]) %*% matrix(c(1, rho[3,i], rho[2,i],
rho[3,i], 1, rho[1,i],
rho[2,i], rho[1,i], 1), 3, 3) %*% diag(sigma[,i])
}), c(3,3,n))
}
shape <- c(2, 5, 10)
rate <- shape
set.seed(17)
system.time(rho <- apply(Sigma <- rcov(1e5, shape, rate), 3, cov2cor)[c(2, 3, 6), ])
gray <- "#f0f0f0"
par(mfrow=c(1,4))
hist(rho, freq=FALSE, col=gray,
main=expression(paste("Histogram of all ", rho[i])), xlab="Value")
abline(h=1 / (0.9 - 0.7), lwd=2)
for (i in 1:3) {
hist(sqrt(Sigma[i,i,]), freq=FALSE, breaks=30, col=gray,
main=bquote(sigma[.(i)]), xlab="Value")
curve(dgamma(x, shape[i], rate[i]), lwd=2, add=TRUE)
}
par(mfrow=c(1,1))