チェースは偉大な答えを提供し、逃げ道while()
反復の問題について言及しています。逃げ道の問題の1つwhile()
の問題の1つは、一度に1つの試行を行い、多くの場合、たとえばとなり、試行でターゲット番号1
に合致する試行が見つかると、オーバーヘッドが発生します。 は、この場合はrbinom()
です。
rbinom()
は、Rにおけるこれらの全ての(擬似)乱数生成器のように、ベクトル化され、我々は一度にメートルトライアルを生成し、適合性のものメートルトライアルを確認することができますので、アウトの方法は、しかし、があります5 1
の要件に従う。何も見つからない場合、我々は一致するものを見つけるまで繰り返しmの試行を行う。この考え方は、以下の関数foo()
に実装されています。 chunkSize
引数は、一度に描画する試行の回数であるmです。私はまた、機能が複数の適合試験を見つけることを可能にする機会を得ました。引数n
は、返す適合試験数を制御します。
foo <- function(probs, target, n = 1, chunkSize = 100) {
len <- length(probs)
out <- matrix(ncol = len, nrow = 0) ## return object
## draw chunkSize trials
trial <- matrix(rbinom(len * chunkSize, 1, probs),
ncol = len, byrow = TRUE)
rs <- rowSums(trial) ## How manys `1`s
ok <- which(rs == 5L) ## which meet the `target`
found <- length(ok) ## how many meet the target
if(found > 0) ## if we found some, add them to out
out <- rbind(out,
trial[ok, , drop = FALSE][seq_len(min(n,found)), ,
drop = FALSE])
## if we haven't found enough, repeat the whole thing until we do
while(found < n) {
trial <- matrix(rbinom(len * chunkSize, 1, probs),
ncol = len, byrow = TRUE)
rs <- rowSums(trial)
ok <- which(rs == 5L)
New <- length(ok)
if(New > 0) {
found <- found + New
out <- rbind(out, trial[ok, , drop = FALSE][seq_len(min(n, New)), ,
drop = FALSE])
}
}
if(n == 1L) ## comment this, and
out <- drop(out) ## this if you don't want dimension dropping
out
}
それはこのように動作します:私はn == 1
場合には空の次元を落とし
> set.seed(1)
> foo(probs, target = 5)
[1] 1 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0
[31] 0
> foo(probs, target = 5, n = 2)
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11]
[1,] 0 0 0 0 0 0 0 0 0 0 0
[2,] 0 0 0 0 0 0 0 0 0 0 1
[,12] [,13] [,14] [,15] [,16] [,17] [,18] [,19] [,20] [,21]
[1,] 0 0 0 1 1 0 0 0 0 0
[2,] 0 1 0 0 1 0 0 0 0 0
[,22] [,23] [,24] [,25] [,26] [,27] [,28] [,29] [,30] [,31]
[1,] 1 0 1 0 0 0 1 0 0 0
[2,] 1 0 1 0 0 0 0 0 0 0
注意。この機能が必要ない場合は、最後のif
コードチャンクをコメントアウトしてください。
chunkSize
のサイズと、一度に多くの試行を確認する計算上の負担とのバランスをとる必要があります。要件(ここでは5 1
s)が非常に低い場合は、への呼び出しが少なくなるように、chunkSize
を増やしてください。要件がある可能性が高い場合は、ポイントドローイングトライアルはほとんどなく、chunkSize
は1回または2回だけ試行してください。
"ベクトルの合計は常に1でなければなりません"。 「...はいつも5でなければならない」という意味ですか? – Chase
あなたは正しいです!それを私が直した。ありがとうございました。 – Laura