1

重複の可能性:
0 と 1 の間のランダムなフロートを生成する方法は?

0 から 1 の間の乱数 (一様分布) を生成したいので、次を使用します。

float x = arc4random_uniform(1);

ただし、これは 0.00000 しか生成しません

使った

float y = arc4random() %11 * 0.1;

間隔で乱数を返しますが、それが一様分布であるかどうかはわかりません。

最初の関数が期待どおりに機能しないのはなぜですか?

4

4 に答える 4

5

私が使う:

float x = arc4random_uniform(1);

ただし、これは 0.00000 しか生成しません

もちろんそうです。arc4random_uniform()32 ビットの符号なし整数を返します。を返しませfloat。あなたが探しているのは次のようなものです

#define RAND_PRECISION 1024

float x = arc4random_uniform(RAND_PRECISION) / (float)RAND_PRECISION;

また、

一様分布かどうかはわかりません。

そうではないので。modulo ( %) 演算子を使用すると、不均一な分布になります。

于 2012-11-28T18:11:27.250 に答える
2

ドキュメントによると、arc4random_uniform は整数を返すため、上限を 1 にして使用すると、必要な結果が得られません。

arc4random 関数のページは次のとおりです: http://www.unix.com/man-page/FreeBSD/3/arc4random_uniform/

于 2012-11-28T18:10:09.470 に答える
0

arc4random_uniformは、指定した上限までの数値を返します(たとえば、arc4random_uniform(10)は0から9までの数値を返します)。そのため、arc4random_uniform(1)は常に0を返す必要があります(これはあなたが見ているものです)。ランダムフロートが必要な場合は、次の回答が表示されます。

0と1の間のランダムフロートを生成します

于 2012-11-28T18:15:28.007 に答える
0
#define ARC4RANDOM_MAX      0x100000000
...
double val = ((double)arc4random() / ARC4RANDOM_MAX);
于 2012-11-28T18:12:00.267 に答える