重複の可能性:
0 と 1 の間のランダムなフロートを生成する方法は?
0 から 1 の間の乱数 (一様分布) を生成したいので、次を使用します。
float x = arc4random_uniform(1);
ただし、これは 0.00000 しか生成しません
使った
float y = arc4random() %11 * 0.1;
間隔で乱数を返しますが、それが一様分布であるかどうかはわかりません。
最初の関数が期待どおりに機能しないのはなぜですか?
重複の可能性:
0 と 1 の間のランダムなフロートを生成する方法は?
0 から 1 の間の乱数 (一様分布) を生成したいので、次を使用します。
float x = arc4random_uniform(1);
ただし、これは 0.00000 しか生成しません
使った
float y = arc4random() %11 * 0.1;
間隔で乱数を返しますが、それが一様分布であるかどうかはわかりません。
最初の関数が期待どおりに機能しないのはなぜですか?
私が使う:
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 ( %
) 演算子を使用すると、不均一な分布になります。
ドキュメントによると、arc4random_uniform は整数を返すため、上限を 1 にして使用すると、必要な結果が得られません。
arc4random 関数のページは次のとおりです: http://www.unix.com/man-page/FreeBSD/3/arc4random_uniform/
arc4random_uniformは、指定した上限までの数値を返します(たとえば、arc4random_uniform(10)は0から9までの数値を返します)。そのため、arc4random_uniform(1)は常に0を返す必要があります(これはあなたが見ているものです)。ランダムフロートが必要な場合は、次の回答が表示されます。
#define ARC4RANDOM_MAX 0x100000000
...
double val = ((double)arc4random() / ARC4RANDOM_MAX);