[解決済み] 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
関連
-
[解決済み】C 言語の添え字で配列の要素値を代入すると、配列でもポインタでもベクトルでもない値になる
-
[解決済み] 文字列をfloatやintにパースするにはどうしたらいいですか?
-
[解決済み] JavaScriptでランダムな文字列/文字を生成する
-
[解決済み] .NETでのdecimal, float, doubleの違い?
-
[解決済み] C言語では「?」演算子は何をするのですか?
-
[解決済み] 乱数(int)を生成する方法を教えてください。
-
[解決済み] JavaScriptで2つの数値の間の乱数を生成する
-
[解決済み] 英数字のランダムな文字列を生成する方法
-
[解決済み] 文字列が数値(float)であるかどうかを確認するにはどうすればよいですか?
-
[解決済み] 0から9までのランダムな整数を生成する
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] strtokのセグメンテーションフォールト
-
[解決済み】式は、単純なポインタ演算を使用して完全なオブジェクト型へのポインタでなければなりません【重複】。
-
[解決済み】エラー:'for'ループの初期宣言はC99モードでしかできない【重複
-
[解決済み] clang: error: linker command failed with exit code 1が表示されるのはなぜですか?
-
[解決済み】エラー:イニシャライザー要素がロード時に計算可能でない
-
[解決済み] テスト
-
[解決済み】「構造体でもユニオンでもないものにメンバー'*******'を要求する」とはどういう意味ですか?
-
[解決済み】インクリメントオペランドとして lvalue が必要です。
-
[解決済み】0LLや0x0ULの意味は何ですか?
-
[解決済み] C言語でランダムなint型を生成するには?