4

これは宿題ではありません。R でコイントスのシミュレーションをセットアップすることに興味があります。シミュレーションを 1 週間実行したいと思います。R には、1 週間などの期間にわたってシミュレーションを開始および停止できる関数はありますか? すべてがうまくいけば、シミュレーション期間の長さを延ばしたいと思うかもしれません.

例えば:

x <- rbinom(10, 1, 1/2)

明確にするために、上記のコードの 10 の代わりに、シミュレーションを 1 週間続けるにはどうすればよいでしょうか(1 週間の試行回数と設定された試行回数)。ありがとう。

4

3 に答える 3

11

次のコードは、3 秒間実行を続けた後、停止して合計を出力します。

x <- Sys.time()
duration <- 3 # number of seconds
heads <- 0
tails <- 0

while(Sys.time() <= x + duration){
  s <- sample(0:1, 1)
  if(s == 1) heads <- heads+1 else tails <- tails+1
  cat(sample(0:1, 1))
}
cat("heads: ", heads)
cat("tails: ", tails)

結果:

001100111000011010000010110111111001011110100110001101101010 ...
heads:  12713
tails:  12836

警告のメモ:

私のマシンの速度では、週末のずっと前に浮動小数点エラーが発生するに違いありません。言い換えれば、マシンが整数、倍精度浮動小数点数、または使用しているものとして格納できる最大値に達すると、コードがクラッシュする可能性があります。

そのため、これを防ぐために、何らかのエラー チェックまたはロールオーバー メカニズムを組み込む必要がある場合があります。


何が起こるかを簡単に説明するには、次のことを試してください。

x <- 1e300
while(is.finite(x)){
  x <- x+x
  cat(x, "\n")
}

R は浮動小数点のオーバーロードを適切に処理し、 を返しますInf

したがって、シミュレーションで持っていたデータはすべて失われます。無限を賢明な程度に分析することは不可能です。

シミュレーションを設計するときは、このことを念頭に置いてください。

于 2012-06-22T14:23:47.477 に答える
3

現在は 1 週間後のタイムスタンプよりも小さいですが、x rbinmo(1,1,1/2)

R> week_later <- strptime("2012-06-22 16:45:00", "%Y-%m-%d %H:%M:%S")
R> x <- rbinom(1, 1, 1/2) // init x
R> while(as.numeric(Sys.time()) < as.numeric(week_later)){
R>   x <- append(x, rbinom(1, 1, 1/2))
R> }
于 2012-06-22T14:24:52.220 に答える
0

harvestrAndrew Redd によるかなり新しいパッケージに興味があるかもしれません。タスクを複数の部分に分割します (部分を並行して実行できるという考えです)。あなたの質問に適用されるパッケージの部分は、すでに処理された部分の結果をキャッシュすることです。そのため、タスクが中断されて再開された場合、終了した部分は再実行されませんが、未完了のもの(途中で中断された曲は、その曲の最初から開始されます)。

これにより、要求に応じてシミュレーションを開始および停止できます。

于 2012-06-22T19:24:46.390 に答える