4

からランダムな float 値を取得するにはどうすればよい/dev/urandomですか?

単にキャストを使用する場合、次のように言います。

int fd = ::open("/dev/urandom", O_RDONLY);
uint32_t n;
read(fd, &n, sizeof(n));
float f = n;

...移植性が保証されているかどうかはわかりません。大きな値のnが必ずしもf? MAXUINT は として表現できることが保証されていfloatますか?

4

3 に答える 3

5

/dev/urandom からランダムなバイトを取得しますが、これらのバイトは必ずしも a) 均一に分散された浮動小数点値、または b) それらを扱うオブジェクトの正当な表現を形成するとは限りません。たとえば、float または int のトラップ表現を持つプラットフォームでは、作成した値がトラップ表現になる可能性があり、作成したランダム値を実際に使用することはできません。

ライブラリの の実装が /dev/urandom へのアクセスを許可していることを確認する必要がありますstd::random_device()(デフォルトで、または次のような文字列引数を取ることによって) 。次に、たとえば取得するためにstd::random_device("/dev/urandom")使用できる乱数エンジンがあります。std::uniform_real_distribution<float>()任意の乱数分布。

✓ libstdc++ はデフォルトで /dev/urandom を使用します:

✓ libc++ も同様です:

✗ Visual Studio の実装では、非決定論的 RNG を使用していません。

✓ VS2012 の時点で、MSDN は「既定で生成される値は非決定論的で暗号的に安全です」と述べており、おそらく Windows の暗号化サービスを介しています。

于 2012-06-26T22:47:08.017 に答える
0

readバイトを直接ランダム化することが可能ですfloat(例: float f; read(fd, &f, sizeof(f));)。IEEE-754 を想定すると、すべてのビット パターンが有効になります (ただし、2 つの無限大と多数のクワイエットおよびシグナリング NaN があります)。ieee754.hまたはを使用fpclassify.hして、これらのいずれかにヒットしたかどうかを判断できます。

もちろん、これが妥当かどうかは、どのような種類のディストリビューションが必要かによって異なります。IEEE-754 を仮定すると、 [0, 2 -126 ) denormals および [2 -126 , 2 -125 ), [2 -125 , 2 -124 ), ...float32の各範囲にわたって均一な分布が得られます。 , [2 127 , 2 128 ) 法線 (およびその否定)。

于 2012-06-26T23:14:08.967 に答える