私は倍精度で数値を提供するメルセンヌツイスターの実装を使用しています。単精度への倍精度の丸め:上限の強制
http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/VERSIONS/FORTRAN/fortran.html(剛多田により、Fortran 77の中に実装、私はgenrand_real2を使用しています)
しかし、私のアプリケーションのニーズ、異なる精度、単精度の乱数で数を乗算しながら、警告を回避するためです。 だから、私は2つのデータ型間の変換に小さな関数を書いた:
function genrand_real()
real genrand_real
real*8 genrand_real2
genrand_real = real(genrand_real2())
return
end
私は私が働いているコードと一致するように現実と実際の* 8を使用しています。 これはほとんどの場合(実際には本当の()がどれくらい速いか分からないだけでなく)、RNGの上限を変更します。変換によって[0,1]が[0 、1]。私はそれに問題があるまでそれについて考えたことはありません。
私の質問は、どのように効率的な方法で上限を保証することができますか、私は単精度実数を提供するgenrand_real2(元のもの)に似た関数を書くことができます。私の推測では、私が唯一の除数4294967296.d0を交換する必要があるが、あなたが投稿機能は、乱数を生成しません
function genrand_real2()
double precision genrand_real2,r
integer genrand_int32
r=dble(genrand_int32())
if(r.lt.0.d0)r=r+2.d0**32
genrand_real2=r/4294967296.d0
return
end
ありがとうございます! あなたは私の問題を解決するだけでなく、私のプログラムをもっと速くしました。 mt19937 経過:11.5120001、ユーザ:11.5120001、sys:0。00000000 mt19937単精度 経過:4.83599997、ユーザー:4.83599997、sys:0.00000000 –
よろしくお願いいたします。これは単純に高精度を使用しないという効果です。欠点はありますが、http://stackoverflow.com/a/17951021/(それはC#用ですが、コンセプトは同じです)を参照してください。しかし、プログラムの残りの部分が単精度の実数であれば、それは重要ではありません。 – StefanS
もう一度、あなたの助けをありがとう、 "その男"であることについて申し訳ありませんが、私は質問をフォローアップがあります:http://stackoverflow.com/questions/37859027/upper-bound-of-random-number-generator –