完全にランダムな文字列や数値を作成できる関数などはありますか?
次の例では、AからZまでの大文字と長さ= lenのアルファベット文字列を生成します。
QString randString(int len)
{
QString str;
str.resize(len);
for (int s = 0; s < len ; ++s)
str[s] = QChar('A' + char(qrand() % ('Z' - 'A')));
return str;
}
これは、指定された範囲内の乱数を生成するための非常に良い方法ではありません。 (実際、それはほとんどのジェネレータにとって非常に悪いです)
ジェネレータからの下位ビットが均一に分布していると想定しています。これはほとんどのジェネレーターには当てはまりません。ほとんどのジェネレータでは、ランダム性は上位ビットで発生します。
除算後の余りを使用することで、事実上ランダム性を捨てることになります。
乗算と除算を使用してスケーリングする必要があります。モジュロ演算子を使用しません。例えば
my_numbe r= start_required + ( generator_output * range_required)/generator_maximum;
generator_output
が[0, generator_maximum]
にある場合、my_number
は[start_required , start_required + range_required]
にあります。
QUuidを使用する
#include <QUuid>
QString randomStr = QUuid::createUuid();
ここ は qrand() を使用する良い答えです。以下の解決策では、すでに上で提案したように、ランダムな一意のIDを生成するために QUuid を使用します(これらはすべてhex
番号です):
#include <QApplication>
#include <QDebug>
#include <QRegularExpression>
#include <QUuid>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
// random hex string generator
for (int i = 0; i < 10; i++)
{
QString str = QUuid::createUuid().toString();
str.remove(QRegularExpression("{|}|-")); // if you want only hex numbers
qDebug() << str;
}
return a.exec();
}
出力
"479a494a852747fe90efe0dc0137d059"
"2cd7e3b404b54fad9154e46c527c368a"
"84e43735eacd4b8f8d733bf642476097"
"d7e824f920874f9d8b4264212f3bd385"
"40b1c6fa89254705801caefdab5edd96"
"b7067852cf9d45ca89dd7af6ffdcdd23"
"9a2e5e6b65c54bea8fb9e7e8e1676a1a"
"981fa826073947e68adc46ddf47e311c"
"129b0ec42aed47d78be4bfe279996990"
"818035b0e83f401d8a56f34122ba7990"