Brian Smith
2025-Apr-21 14:27 UTC
[R] Generate random vectors (continuous number) with a fixed sum
Hi, There is a function called RandVec in the package Surrogate which can generate andom vectors (continuous number) with a fixed sum The help page of this function states that: a The function RandVec generates an n by m matrix x. Each of the m columns contain n random values lying in the interval [a,b]. The argument a specifies the lower limit of the interval. Default 0. b The argument b specifies the upper limit of the interval. Default 1. However in my case, the lower and upper limits are not same. For example, if I need to draw a pair of number x, y, such that x + y = 1, then the lower and upper limits are different. I tried with below code library(Surrogate) RandVec(a=c(0.1, 0.2), b=c(0.2, 0.8), s=1, n=2, m=5)$RandVecOutput This generates error with message Error in if (b - a == 0) { : the condition has length > 1 Is there any way to generate the numbers with different lower and upper limits?
Eric Berger
2025-Apr-21 14:52 UTC
[R] Generate random vectors (continuous number) with a fixed sum
RandVec expects both a and b to be single numbers, not numeric vectors of length > 1. You could create pairs of (a,b) values and cycle through them. There are many ways to do that. Here is one example. (Note that using a=0.1, b=.2, s=1, n=2 is impossible to achieve, since two numbers bounded above by 0.2 cannot add to 1) z <- list(c(.1,.2), (.2,.8)) sapply(1:length(z), \(i) RandVec(z[[i]][1], z[[i]][2], s=1, n=2, m=5)) HTH, Eric On Mon, Apr 21, 2025 at 5:28?PM Brian Smith <briansmith199312 at gmail.com> wrote:> > Hi, > > There is a function called RandVec in the package Surrogate which can > generate andom vectors (continuous number) with a fixed sum > > The help page of this function states that: > > a > > The function RandVec generates an n by m matrix x. Each of the m > columns contain n random values lying in the interval [a,b]. The > argument a specifies the lower limit of the interval. Default 0. > > b > > The argument b specifies the upper limit of the interval. Default 1. > > However in my case, the lower and upper limits are not same. For > example, if I need to draw a pair of number x, y, such that x + y = 1, > then the lower and upper limits are different. > > I tried with below code > > library(Surrogate) > > RandVec(a=c(0.1, 0.2), b=c(0.2, 0.8), s=1, n=2, m=5)$RandVecOutput > > This generates error with message > > Error in if (b - a == 0) { : the condition has length > 1 > > Is there any way to generate the numbers with different lower and upper limits? > > ______________________________________________ > R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see > https://stat.ethz.ch/mailman/listinfo/r-help > PLEASE do read the posting guide https://www.R-project.org/posting-guide.html > and provide commented, minimal, self-contained, reproducible code.
Rui Barradas
2025-Apr-21 15:08 UTC
[R] Generate random vectors (continuous number) with a fixed sum
?s 15:27 de 21/04/2025, Brian Smith escreveu:> Hi, > > There is a function called RandVec in the package Surrogate which can > generate andom vectors (continuous number) with a fixed sum > > The help page of this function states that: > > a > > The function RandVec generates an n by m matrix x. Each of the m > columns contain n random values lying in the interval [a,b]. The > argument a specifies the lower limit of the interval. Default 0. > > b > > The argument b specifies the upper limit of the interval. Default 1. > > However in my case, the lower and upper limits are not same. For > example, if I need to draw a pair of number x, y, such that x + y = 1, > then the lower and upper limits are different. > > I tried with below code > > library(Surrogate) > > RandVec(a=c(0.1, 0.2), b=c(0.2, 0.8), s=1, n=2, m=5)$RandVecOutput > > This generates error with message > > Error in if (b - a == 0) { : the condition has length > 1 > > Is there any way to generate the numbers with different lower and upper limits? > > ______________________________________________ > R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see > https://stat.ethz.ch/mailman/listinfo/r-help > PLEASE do read the posting guide https://www.R-project.org/posting-guide.html > and provide commented, minimal, self-contained, reproducible code.Hello, Use ?mapply to cycle through all values of a and b. Note that the output matrices are transposed, the random vectors are the rows. library(Surrogate) a <- c(0.1, 0.2) b <- c(0.2, 0.8) mapply(\(a, b, s, n, m) RandVec(a, b, s, n, m), MoreArgs = list(s = 1, n = 2, m = 5), a, b) #> $RandVecOutput #> [,1] [,2] [,3] [,4] [,5] #> [1,] 0.2004363 0.1552328 0.2391742 0.1744857 0.1949236 #> [2,] 0.1995637 0.2447672 0.1608258 0.2255143 0.2050764 #> #> $RandVecOutput #> [,1] [,2] [,3] [,4] [,5] #> [1,] 0.2157416 0.4691191 0.5067447 0.7749258 0.7728955 #> [2,] 0.7842584 0.5308809 0.4932553 0.2250742 0.2271045 Hope this helps, Rui Barradas -- Este e-mail foi analisado pelo software antiv?rus AVG para verificar a presen?a de v?rus. www.avg.com