C++でランダムなfloat値を生成する方法
C言語やC++では、標準の rand() 関数は整数(int)しか返さないため、ランダムな浮動小数点数(float)を直接生成することはできません。しかし、いくつかのテクニックを組み合わせれば、簡単にランダムなfloat値を作成できます。
基本的な考え方:乱数をRAND_MAXで割る
rand() は 0 から RAND_MAX までの整数を返します。この値を float 型にキャストしてから RAND_MAX で除算すると、必ず 0.0 ~ 1.0 の範囲の実数が得られます。さらに、任意の上限値までの乱数が必要な場合は、その値を掛けるだけで範囲をスケールできます。
なお、整数同士のまま除算すると商が整数になってしまうことがあるため、分子・分母ともに明示的に float 型へキャストしてから計算するのが重要なポイントです。
サンプルコード
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
int main() {
srand((unsigned int)time(NULL));
float a = 5.0;
for (int i = 0; i < 20; i++)
cout << (float(rand()) / float(RAND_MAX) * a) << endl;
}このコードでは、まず srand() で現在時刻をシードとして乱数列を初期化しています。その後、0.0 ~ 5.0 の範囲のランダムなfloat値を20個出力します。
実行結果
2.07648 4.3115 1.31092 2.22465 2.17292 1.48381 1.91137 0.56505 2.24326 4.44517 3.1695 2.39067 1.89062 4.35881 4.17524 0.189673 1.87521 1.76916 2.3217 2.20481
※ 実行するたびに異なる値が出力されます。
C++11以降なら <random> ヘッダーがおすすめ
C++11以降の環境では、<random> ヘッダーを使うと、より高品質かつ簡潔にランダムな実数を生成できます。uniform_real_distribution を利用すれば、指定した範囲の一様分布に従うfloat値を直接取得できるため、キャストや除算の手間が不要になります。
#include <iostream>
#include <random>
using namespace std;
int main() {
random_device rd;
mt19937 gen(rd());
uniform_real_distribution<float> dist(0.0f, 5.0f);
for (int i = 0; i < 20; i++)
cout << dist(gen) << endl;
}従来の rand() 方式は手軽ですが、乱数の品質や範囲の偏りに注意が必要です。新しいプロジェクトでは、C++11の <random> ライブラリを使用するのが現代的で推奨されるアプローチです。
-
Microsoft Excelでランダムな強力なパスワードを生成する方法
強力なパスワードは、ハッカーによるブルートフォース攻撃をはじめとするサイバー攻撃からオンラインアカウントを守るために欠かせません。この記事では、Microsoft Excelを使ってランダムな強力なパスワードを生成する方法を詳しく解説します。 Excelにはセルの値を計算するための組み込み関数が多数用意されており、指定した範囲からランダムな数値を素早く生成できる乱数生成関数(RANDBETWEEN)もそのひとつです。では、この関数を活用して強力なパスワードを生成するにはどうすればよいのでしょうか。本チュートリアルで順を追ってご紹介します。 Excelでランダムな強力なパスワードを生成する手順
-
Rubyで乱数とランダム文字列を生成する方法を徹底解説
Rubyで乱数やランダムな文字列を生成する方法を学びたいなら、ここがまさにうってつけの場所です。 この記事では、Rubyにおける乱数生成のさまざまなテクニックを、具体例とともにわかりやすく解説します。 乱数を使えば、配列からランダムに要素を選んだり、リストから当選者を抽選したり、サイコロの目をシミュレートしたりと、幅広い用途に活用できます。 Rubyには、性質の異なる複数の乱数生成方法が用意されています。 たとえば… randメソッドには3通りの使い方があります。 引数なしでrandを呼び出すと、0から1までの浮動小数点数(例: 0.4836732493)が返される 整数を引数に渡す(ran