Создайте случайную строку или число в Qt4

Как упоминалось ранее, во время компиляции выполняется перегрузка разрешения.

Java Puzzlers имеет приятный пример:

Головоломка 46: Случай Confusing Constructor

Эта головоломка представляет вам два конструктора Confusing. Основной метод вызывает конструктор, но какой? Выход программы зависит от ответа. Что делает программа, или она даже законна?

public class Confusing {

    private Confusing(Object o) {
        System.out.println("Object");
    }

    private Confusing(double[] dArray) {
        System.out.println("double array");
    }

    public static void main(String[] args) {
        new Confusing(null);
    }
}

Решение 46: Случай смущающего конструктора

... Процесс разрешения перегрузки Java работает в два этапа. На первом этапе выбираются все доступные или применимые методы или конструкторы. Вторая фаза выбирает наиболее специфичный методов или конструкторов, выбранных на первой фазе. Один метод или конструктор менее конкретный , чем другой, если он может принимать любые параметры, переданные другому [JLS 15.12.2.5].

В нашей программе оба конструктора доступны и применимы , Конструктор Confusing (Object) принимает любой параметр, переданный в Confusing (double []) , поэтому Confusing (Object) менее специфичен. (Каждый двойной массив является Object , но не каждый Object является двойным массивом .) Наиболее специфический конструктор поэтому Confusing (double []) , который объясняет вывод программы.

Такое поведение имеет смысл, если вы передадите значение типа double [] ; это противоречит, если вы передадите null . Ключом к пониманию этой головоломки является то, что тест, для которого метод или конструктор наиболее специфичен, не использует фактические параметры: параметры, появляющиеся в вызове. Они используются только для определения того, какие перегрузки применимы. Когда компилятор определяет, какие перегрузки применимы и доступны, он выбирает наиболее специфическую перегрузку, используя только формальные параметры: параметры, появляющиеся в объявлении.

Чтобы вызвать Confusing (Object) с параметром null , напишите new Confusing ((Object) null) . Это гарантирует, что применим только Confusing (Object) . В более общем плане, чтобы заставить компилятор выбрать конкретную перегрузку, применить фактические параметры к объявленным типам формальных параметров.

21
задан defiant 14 July 2010 в 09:49
поделиться

6 ответов

Вы можете создавать случайные числа, используя и . Если вам нужны строки, вы можете преобразовать int в строку. Вы также можете проверить класс QUuid , который генерирует универсально уникальные идентификаторы. Они не являются «абсолютно случайными», но они уникальны.

18
ответ дан kqt 14 July 2010 в 09:49
поделиться

Использовать QUuid

#include <QUuid>
QString randomStr = QUuid::createUuid();
0
ответ дан Bibin Venugopal 14 July 2010 в 09:49
поделиться
int number;
int randomValue = qrand() % number;

возвращает случайное число randomValue с 0 < = randomValue < number.

qrand() объявлен в QtGlobal , который # включен во многие другие файлы Qt.

int value;
QString aString = QString::number(value);

преобразует целое число в QString.

12
ответ дан ssc 14 July 2010 в 09:49
поделиться

В следующем примере генерируются буквенные строки с заглавными буквами от A до Z и length = 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;
}
2
ответ дан Uga Buga 14 July 2010 в 09:49
поделиться

Здесь - хороший ответ, используя qrand () . В приведенном ниже решении используется 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"
0
ответ дан Bobur 14 July 2010 в 09:49
поделиться

Это не очень хороший метод для генерации случайных чисел в заданном диапазоне. (На самом деле это очень и очень плохо для большинства генераторов)

Вы предполагаете, что младшие биты от генератора распределены равномерно. Это не относится к большинству генераторов. В большинстве генераторов случайность встречается в старших разрядах.

Используя остаток после деления, вы фактически выбрасываете случайность.

Вы должны масштабировать, используя умножение и деление. Не используется оператор по модулю. например,

my_numbe r= start_required + ( generator_output *  range_required)/generator_maximum;

Если generator_output в [0, generator_maximum], my_number будет в [start_required , start_required + range_required].

2
ответ дан AbcAeffchen 14 July 2010 в 09:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: