1

私はこの質問者とは反対の問題を抱えています:Rコード内でシードを渡す/シードを設定する/C。私の問題は、R乱数ジェネレーターを使用してCコードで乱数を生成したいのですが、実行するたびに同じ「ランダム」値を取得することです。これが私のコードです(私がたまたま使用しているヘッダーファイルを含みますが、コードスニペットにすべてが必要なわけではありません):

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <math.h>   // C header files

#include <R.h>
#include <R_ext/Utils.h>
#include <Rmath.h>

void main(){
GetRNGstate();
double u = unif_rand();
PutRNGstate();
Rprintf("%f\n",u);
}

R CMD SHLIBでコンパイルし、dyn.load()を使用した後、RWindowsGUIから呼び出します。

> .C("main")
0.000889
list()

そして今、Rを閉じて再起動し、dyn.load()を再度実行すると(ただし、2回目のコンパイルは行われません):

> .C("main")
0.000889
list()

私がインターネットで見つけたさまざまなコードと「WritingRExtensions」マニュアルによると、これは起こらないはずです。しかし、私はおそらく一歩を逃していますか?

4

1 に答える 1

0

これを複製することはできません。

これは完全で再現可能な例であり、最小限の関数の構築、コンパイル、リンク、およびロードを支援するためにインラインパッケージのみに依存しています。

R> library(inline)
R> src <- '
+   GetRNGstate();
+   double u = unif_rand();
+   Rprintf("%f\\n",u);
+   PutRNGstate();
+   return R_NilValue;
+ '
R> fun <- cxxfunction(signature(), body=src)
R> set.seed(42)
R> invisible(fun())   # invisible to suppress the NULL return in foo()
0.914806
R> invisible(fun())
0.937075
R> invisible(fun())
0.286140
R> invisible(fun())
0.830448
R> invisible(fun())
0.641746
R> 

そして、シードをリセットすると、同じシーケンスが開始されます。

R> set.seed(42)
R> invisible(fun())
0.914806
R> invisible(fun())
0.937075
R> invisible(fun())
0.286140
R> 

RNGの設定に関連する副作用を伴う別の関数をロード/実行している可能性があります。main()また、それが不明確な場合に備えて、 R自体にaを含む関数をロードできないため、例をロードすることはできません。

于 2013-01-28T03:54:23.260 に答える