[R] Code of sample() in C

Paul Smith phhs80 at gmail.com
Mon Apr 6 11:41:19 CEST 2009


Thanks, Ranjan! I have tried to use the function SampleNoReplace in
random.c, which seems to work, except that I get always the same
random numbers (with your code the same happens). (My code is below.).

I have read the documentation ("Writing R extensions"), where it is advised:

«The interface to R’s internal random number generation routines is

double unif_rand();
double norm_rand();
double exp_rand();

giving one uniform, normal or exponential pseudo-random variate.
However, before these are used, the user must call

GetRNGstate();

and after all the required variates have been generated, call

PutRNGstate();»

However, when I use GetRNGstate() and PutRNGstate(), I get the following errors:

$ gcc -I/usr/include/R -o myprog myprog.c -lRmath -lm
/tmp/cc6CMnlh.o: In function `main':
myprog.c:(.text+0x30): undefined reference to `GetRNGstate'
myprog.c:(.text+0x57): undefined reference to `PutRNGstate'
collect2: ld returned 1 exit status
$

Any ideas?

Paul

--------------------------------------

#include <stdio.h>
#include <stdlib.h>
#include <R.h>
#include <Rmath.h>
#define MATHLIB STANDALONE
#include <math.h>

void snr(int k, int n, int *y, int *x);

int main()
{

  int *x = malloc(50*sizeof(int));
  int *y = malloc(5*sizeof(int));
  int i;

  GetRNGstate();
  snr(5,50,y,x);
  PutRNGstate();

  for(i=0;i<5;++i)
    printf("%d ",y[i]);

  free(x);
  free(y);

  return 0;

}


void snr(int k, int n, int *y, int *x)
{
    int i, j;
    for (i = 0; i < n; i++)
        x[i] = i;
    for (i = 0; i < k; i++) {
        j = n * unif_rand();
        y[i] = x[j] + 1;
        x[j] = x[--n];
    }
}

--------------------------------------



On Sun, Apr 5, 2009 at 11:00 PM, Ranjan Maitra <maitra at iastate.edu> wrote:
> I presume you mean sampling without replacement? The following
> (adapted from the file you asked for) will do it, but you will need to
> incorporate Rmath as standalone in order to get runif to work.
>
> This function will give you k indices from n, sampled WOR. Thus, n = 50
> for you and k = 5. You will get a vector y of length 5 (a pointer of int
> actually) which will contain these indices.
>
> Thus you will define a vector z (of length 50) which is 1:50, and then
> using the function, your SRWOR sample will be z[y[i]] where i = 0,
> 1,...4.
>
> I haven't tried this function out much myself, so YMMV.
>
> HTH!
>
> Best wishes,
> Ranjan
>
>
>
> #include <stdlib.h>
> #ifndef USING_RLIB
> #define MATHLIB_STANDALONE 1 /*It is essential to have this before the call
>                               to the Rmath's header file because this decides
>                               the definitions to be set. */
> #endif
> #include <Rmath.h>
>
> /* Note that use of this function involves a prior call to the Rmath library to
>   get the seeds in place. It is assumed that this is done in the calling
>   function. */
>
> /* Equal probability sampling; without-replacement case */
> /* Adapted from the R function called SampleNoReplace */
>
> /**
>  * Stores k out of n indices sampled at random without replacement
>  * in y.
>  */
> int srswor(int n, int k, int *y)
> {
>  if (k > n) {
>    return 1;
>  }
>  else {
>    const double len = (double) n;
>    int i;
>    int* x = malloc(n * sizeof(int));
>    if (!x) {
>      return 2;
>    }
>
>    for (i = 0; i < n; ++i)     x[i] = i;
>
>    for (i = 0; i < k; ++i) {
>      const int j = (int)(len * runif(0.0, 1.0));
>      y[i] = x[j];
>      x[j] = x[--n];
>    }
>    free(x);
>  }
>  return 0;
> }
>
>
>
> On Sun, 5 Apr 2009 20:11:04 +0100 Paul Smith <phhs80 at gmail.com> wrote:
>
>> Thanks, Ranjan. Got it!
>>
>> I am now wondering whether there is some simpler way of implementing
>> the following in C:
>>
>> sample(1:50,5)
>>
>> Paul
>>
>>
>> On Sun, Apr 5, 2009 at 4:10 PM, Ranjan Maitra <maitra at iastate.edu> wrote:
>> > Hi Paul,
>> >
>> > It is in the main/src/random.c file of the source code.
>> >
>> > HTH!
>> > Best wishes,
>> > Ranjan
>> >
>> > On Sun, 5 Apr 2009 15:35:25 +0100 Paul Smith <phhs80 at gmail.com> wrote:
>> >
>> >> Dear All,
>> >>
>> >> I would like to use the function sample() in a program written in C.
>> >> Is there somewhere the code of sample() written in C?
>> >>
>> >> Thanks in advance,
>> >>
>> >> Paul
>> >>
>> >> ______________________________________________
>> >> R-help at r-project.org 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.
>> >>
>> >
>> > ______________________________________________
>> > R-help at r-project.org 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.
>> >
>>
>> ______________________________________________
>> R-help at r-project.org 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.
>>
>
> ______________________________________________
> R-help at r-project.org 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