-1

母集団から特定の数のオブジェクトをサンプリングする必要があります。次のコードは、置換を伴うサンプリングを示しています。交換せずにサンプリングに使用できる条件は何ですか?

do while(j .lt. w)
   call random_number(u1)
   j1 = 1 + int(population*u1)
   Z = inftime(j1)
   Z1 = X(j1)
   Z2 = Y(j1)
   do t = 1, 10
      if(Z.gt.0 .and. Z.le.10)then
         if(t==Z .and.( my_cnt(t) .lt. k1(t)))then
            my_cnt(t) = my_cnt(t) + 1
            j = j+1
            inftime1(j)= Z 
            X1(j) = Z1
            Y1(j) = z2
         endif
      endif
   enddo
enddo

前もって感謝します

4

1 に答える 1

6

私が正しく理解していれば、あなたはステートメントを使用します

   call random_number(u1)
   j1 = 1 + int(population*u1)

整数インデックス()を生成して、母集団のj1番目j1の要素を選択します。nの母集団のうちi番目の要素と呼びます。ループの各反復で、新しい乱数を生成し、新しいi番目の要素を選択します。これは、1つ(または複数)の前の反復で選択した要素と同じである可能性があります。すでに選択されているiを再選択することを回避するアプローチが必要です。少なくとも3つのアプローチがあると思います。

1つ:すでに使用したiのリストを保持します。乱数ジェネレーターが後の反復で同じiをスローする場合は、新しいダイスを取得するまでダイスを再度スローします。これには、少し簡単な簿記が必要です。これをプログラミングするのに助けが必要な場合は、質問を編集してください。この方法は、すでに選択されているiの割合が大きくなるにつれて、その魅力を失い始めます。人口のメンバーの50%を選択した場合、新しいiごとに(平均して)2回サイコロを振る必要があります。これがあなたにとって深刻な問題であるかどうかを決めることができます。

2:母集団のランダム順列を作成します。最初の反復では、最初の母集団を(新しいランダムな順序で)選択し、2番目の反復では2番目の母集団を選択します。もちろん、母集団を実際に並べ替えるわけではなく、母集団へのインデックスのランダムな順列を作成します。 このウィキペディアの記事は、このようなランダム順列を作成する方法を提案しています。繰り返しますが、これをコーディングするのに問題がある場合は、質問を編集するか、新しい質問をしてください。

Three:これはTwoのバリエーションであり、私が行うことです。まず、ループの外側で、n個の乱数の配列を作成します。

real, dimension(n) :: random_array
.
.
call random_number(random_array)

次に、ループ内で、配列内の最小値のインデックスを見つけます。

j1 = minloc(random_array, dim=1)

私はあなたの表記に戻りj1、人口の指標として使用したことに注意してください。dim=1スカラーを返すようにするための呼び出しの仕様にも注意してくださいminloc。これはFortran2003のセマンティクスであり、以前の実装では1要素のランク1配列が返される可能性があるため、コンパイラのドキュメントを確認してください。

配列内で同じ値を持つ2つ(またはそれ以上)の要素が見つかった場合minloc、それらはsであるため比較的可能性は低くreal、最初に見つかった要素のインデックスを返すだけです。これは、私たちの目的には問題ありません。

次に、次の反復で同じインデックスを選択しないようにするには、次のようにします。

random_array(j1) = huge(1.0)

呼び出しの引数が。の番号hugeと同じタイプおよび種類であることを確認するように注意してください。realrandom_array

これは、母集団の要素を置換せずにランダムに列挙する必要があります。

于 2012-08-10T08:42:47.020 に答える