乱数の生成
実数の乱数を生成するのは、コンピュータにとってかなり難しい作業です。一般的には、疑似乱数生成(PRNG)のみを利用しています。Qtフレームワークは、std::rand()のスレッドセーフ版であるqrand()という関数を提供しています。この関数は 0 から RAND_MAX (stdlib.h で定義されている) の間の整数を返します。以下のコードは、2つの疑似乱数を示しています。
qDebug() << "first number is" << qrand() % 10;
qDebug() << "second number is" << qrand() % 10;
0から9の間の値を取得するためにmodulo演算子を使用しています。アプリケーションを何度か実行してみてください。数値はいつも同じですが、私たちの場合は3から7になります。これは qrand() を呼び出すたびに、擬似乱数列の次の数字を取得しているからです。幸いなことに、qsrand() を使用して PRNG をシードで初期化することができます。シードとは、シーケンスを生成するために使用される符号なし整数です。次のスニペットを試してみてください。
qsrand(3);
qDebug() << "first number is" << qrand() % 10;
qDebug() << "second number is" << qrand() % 10;
この例では、シード3を使用しており、qrand()とは異なる値を取得しています。コンピューターでは5と4です。すばらしいですが、このアプリケーションを数回実行すると、常にこのシーケンスが発生します。アプリケーションを実行するたびに異なるシーケンスを生成する1つの方法は、実行ごとに異なるシードを使用することです。次のコードスニペットを実行します。
qsrand(QDateTime::currentDateTime().toTime_t());
qDebug() << "first number is" << qrand() % 10;
qDebug() << "second number is" << qrand() % 10;
ご覧のように、QDateTimeからのエポックタイムでPRNGを初期化しています。アプリケーションを複数回実行してみて、毎回異なる数値が得られることを確認してみてください!ただし、この方法は暗号化にはあまりお勧めできません。この場合は、より強力な乱数エンジンを使用する必要があります。