の範囲でランダムな浮動小数点数を生成する解決策が見つかりません[0,a]
。ここでa
、ユーザーによって定義された浮動小数点数です。
以下を試してみましたが、正しく動作しないようです。
float x=(float)rand()/((float)RAND_MAX/a)
の範囲でランダムな浮動小数点数を生成する解決策が見つかりません[0,a]
。ここでa
、ユーザーによって定義された浮動小数点数です。
以下を試してみましたが、正しく動作しないようです。
float x=(float)rand()/((float)RAND_MAX/a)
試す:
float x = (float)rand()/(float)(RAND_MAX/a);
これがどのように機能するかを理解するには、次のことを考慮してください。
N = a random value in [0..RAND_MAX] inclusively.
上記の式 (わかりやすくするためにキャストを削除しています) は次のようになります。
N/(RAND_MAX/a)
ただし、分数による除算は、その分数の逆数を掛けることと同等であるため、これは次と同等です。
N * (a/RAND_MAX)
次のように書き換えることができます。
a * (N/RAND_MAX)
N/RAND_MAX
は常に 0.0 と 1.0 の間の浮動小数点値であると考えると、これは 0.0 と の間の値を生成しますa
。
または、以下を使用することもできます。これは、上で示した内訳を効果的に行います。実際に何が起こっているのかがより明確であるという理由だけで、私は実際にこれを好みます(とにかく、私にとって):
float x = ((float)rand()/(float)(RAND_MAX)) * a;
注: の浮動小数点表現は正確a
でなければなりません。そうしないと、絶対エッジ ケースにヒットしません(近くなります)。理由の詳細については、この記事を参照してください。a
サンプル
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(int argc, char *argv[])
{
srand((unsigned int)time(NULL));
float a = 5.0;
for (int i=0;i<20;i++)
printf("%f\n", ((float)rand()/(float)(RAND_MAX)) * a);
return 0;
}
出力
1.625741
3.832026
4.853078
0.687247
0.568085
2.810053
3.561830
3.674827
2.814782
3.047727
3.154944
0.141873
4.464814
0.124696
0.766487
2.349450
2.201889
2.148071
2.624953
2.578719
これにより、2 つの float の間にランダムな float が生成されます。
float RandomFloat(float min, float max){
return ((max - min) * ((float)rand() / RAND_MAX)) + min;
}