[R] random numbers with constraints
Martin Maechler
m@ech|er @end|ng |rom @t@t@m@th@ethz@ch
Thu Jan 28 16:42:25 CET 2021
>>>>> Abby Spurdle
>>>>> on Thu, 28 Jan 2021 08:48:06 +1300 writes:
> I note that there's a possibility of floating point errors.
> If all values have one digit after the decimal point, you could replace:
> qexp (p, rate) with round (qexp (p, rate), 1).
> However, sometimes uniroot will fail, due to problems with input.
I also think the constrained.sample() function should not
depend on the global variable 'u',
but rather depend on 'n' and construct 'u' from runif(n).
Martin
> On Thu, Jan 28, 2021 at 5:02 AM Denis Francisci
> <denis.francisci using gmail.com> wrote:
>>
>> Wonderful!
>> This is exactly what I need!
>> Thank you very much!!
>>
>> Denis
>>
>>
>>
>> Il giorno mer 27 gen 2021 alle ore 10:58 Abby Spurdle <spurdle.a using gmail.com> ha scritto:
>>>
>>> u <- runif (410)
>>> u <- (u - min (u) ) / diff (range (u) )
>>>
>>> constrained.sample <- function (rate)
>>> { plim <- pexp (c (9.6, 11.6), rate)
>>> p <- plim [1] + diff (plim) * u
>>> qexp (p, rate)
>>> }
>>>
>>> diff.sum <- function (rate)
>>> sum (constrained.sample (rate) ) - 4200
>>>
>>> rate <- uniroot (diff.sum, c (1, 2) )$root
>>> q <- constrained.sample (rate)
>>>
>>> length (q)
>>> range (q)
>>> sum (q)
>>>
>>>
>>> On Wed, Jan 27, 2021 at 9:03 PM Denis Francisci
>>> <denis.francisci using gmail.com> wrote:
>>> >
>>> > Hi,
>>> > I would like to generate random numbers in R with some constraints:
>>> > - my vector of numbers must contain 410 values;
>>> > - min value must be 9.6 and max value must be 11.6;
>>> > - sum of vector's values must be 4200.
>>> > Is there a way to do this in R?
>>> > And is it possible to generate this series in such a way that it follows a
>>> > specific distribution form (for example exponential)?
>>> > Thank you in advance,
>>> >
>>> > D.
More information about the R-help
mailing list