4

[0,1] の浮動小数点数から [0,1] の浮動小数点数までの反復可能な疑似乱数関数が必要です。つまり、32 ビットの IEEE 浮動小数点数を指定すると、"異なる" 浮動小数点数を返します (24 ビットの仮数部を考慮して、可能な限りランダムに)。反復可能でなければならないため、大量の内部状態を保持することはできません。残念ながら、32 ビットの int と single-float の数学でのみ動作する必要があります (必要に応じてエミュレートできますが、double はなく、32x32=64 ビットの乗算もありません。基本的には、古い CUDA ハードウェアで動作する必要があります)。もちろん、これらのかなり厳しい制限内では、ランダム性が優れているほど優れています。誰にもアイデアはありますか?

(私は、64 ビットの int 演算を必要とする Park-Miller と、double を必要とする Park-Miller の CUDA バージョン、多くの内部状態を持つ Mersenne Twisters、および機能しなかった他のいくつかのことを経験しました。 )

4

3 に答える 3

3

NVIDIA CUDA Toolkit にはCURANDというライブラリが含まれており、これはあなたの要件に合っていると思います。再現可能な結果を​​生成し (同じシードで開始すると仮定)、GPU で動作し、32 ビットの float と int をサポートし、古い GPU でも動作するはずです。また、複数の疑似乱数および準乱数の生成アルゴリズムと分布もサポートしています。

[注: C ライブラリの rand() 関数を使用する際の問題 (デバイス上の CUDA で実行されないこと以外) は、Windows では、rand() は 16 ビット値のみを返すため、 RAND_MAX による除算の精度は、ランダムな 16 ビットのみです。さらに、linux/mac では 32 ビット値を返すため、それを使用するコードは数値的に移植できません。]

于 2011-06-01T00:46:38.930 に答える
2

標準 C ライブラリrand()関数を使用して、結果を で除算してみませんRAND_MAXか?

#include <stdlib.h>
float randf (void)
{
     return rand() / (float) RAND_MAX;
}
于 2011-05-31T23:09:20.713 に答える