1. ホーム
  2. c

[解決済み] C言語で浮動小数点数の乱数を生成する方法

2022-02-13 10:59:47

質問

の範囲にあるランダムな浮動小数点数を生成するための解決策が見つからない。 [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 から 1.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