[R] Generate random vectors (continuous number) with a fixed sum

Rui Barradas ru|pb@rr@d@@ @end|ng |rom @@po@pt
Mon Apr 21 17:13:37 CEST 2025


Hello,

Inline.

Às 16:08 de 21/04/2025, Rui Barradas escreveu:
> À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 using 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.
Sorry, this is not true. The columns are the random vectors, as 
documented. An example setting the RNG seed, for reproducibility.


library(Surrogate)

a <- c(0.1, 0.2)
b <- c(0.2, 0.8)
set.seed(2025)
res <- mapply(\(a, b, s, n, m) RandVec(a, b, s, n, m),
               MoreArgs = list(s = 1, n = 2, m = 5), a, b)

res
#> $RandVecOutput
#>          [,1]      [,2]      [,3]     [,4]      [,5]
#> [1,] 0.146079 0.1649319 0.1413759 0.257086 0.1715478
#> [2,] 0.253921 0.2350681 0.2586241 0.142914 0.2284522
#>
#> $RandVecOutput
#>           [,1]      [,2]      [,3]      [,4]      [,5]
#> [1,] 0.5930918 0.2154583 0.6915523 0.7167089 0.3617918
#> [2,] 0.4069082 0.7845417 0.3084477 0.2832911 0.6382082

lapply(res, colSums)
#> $RandVecOutput
#> [1] 0.4 0.4 0.4 0.4 0.4
#>
#> $RandVecOutput
#> [1] 1 1 1 1 1


Hope this helps,

Rui Barradas
> 
> 
> 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



More information about the R-help mailing list