[R] uniform integer RNG 0 to t inclusive

Duncan Murdoch murdoch at stats.uwo.ca
Mon Sep 18 22:46:23 CEST 2006


On 9/18/2006 3:37 AM, Sean O'Riordain wrote:
> Good morning,
> 
> I'm trying to concisely generate a single integer from 0 to n
> inclusive, where n might be of the order of hundreds of millions.
> This will however be used many times during the general procedure, so
> it must be "reasonably efficient" in both memory and time... (at some
> later stage in the development I hope to go vectorized)
> 
> The examples I've found through searching RSiteSearch() relating to
> generating random integers say to use : sample(0:n, 1)
> However, when n is "large" this first generates a large sequence 0:n
> before taking a sample of one... this computer doesn't have the memory
> for that!

You don't need to give the whole vector:  just give n, and you'll get 
draws from 1:n.  The man page is clear on this.

So what you want is sample(n+1, 1) - 1.  (Use "replace=TRUE" if you want 
a sample bigger than 1, or you'll get sampling without replacement.)
> 
> When I look at the documentation for runif(n, min, max) it states that
> the generated numbers will be min <= x <= max.  Note the "<= max"...

Actually it says that's the range for the uniform density.  It's silent 
on the range of the output.  But it's good defensive programming to 
assume that it's possible to get the endpoints.

> 
> How do I generate an x such that the probability of being (the
> integer) max is the same as any other integer from min (an integer) to
> max-1 (an integer) inclusive... My attempt is:
> 
> urand.int <- function(n,t) {
>   as.integer(runif(n,min=0, max=t+1-.Machine$double.eps))
> }
> # where I've included the parameter n to help testing...

Because of rounding error, t+1-.Machine$double.eps might be exactly 
equal to t+1.  I'd suggest using a rejection method if you need to use 
this approach:  but sample() is better in the cases where as.integer() 
will work.

Duncan Murdoch
> 
> is floor() "better" than as.integer?
> 
> Is this correct?  Is the probability of the integer t the same as the
> integer 1 or 0 etc... I have done some rudimentary testing and this
> appears to work, but power being what it is, I can't see how to
> realistically test this hypothesis.
> 
> Or is there a a better way of doing this?
> 
> I'm trying to implement an algorithm which samples into an array,
> hence the need for an integer - and yes I know about sample() thanks!
> :-)
> 
> { incidentally, I was surprised to note that the maximum value
> returned by summary(integer_vector) is "pretty" and appears to be
> rounded up to a "nice round number", and is not necessarily the same
> as max(integer_vector) where the value is large, i.e. of the order of
> say 50 million }
> 
> Is version etc relevant? (I'll want to be portable)
>> version               _
> platform       i386-pc-mingw32
> arch           i386
> os             mingw32
> system         i386, mingw32
> status
> major          2
> minor          3.1
> year           2006
> month          06
> day            01
> svn rev        38247
> language       R
> version.string Version 2.3.1 (2006-06-01)
> 
> Many thanks in advance for your help.
> Sean O'Riordain
> affiliation <- NULL
> 
> ______________________________________________
> R-help at stat.math.ethz.ch mailing list
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
> and provide commented, minimal, self-contained, reproducible code.



More information about the R-help mailing list