이 페이지에서

QRandomGenerator Class

QRandomGenerator 클래스를 사용하면 고성능 난수 생성기에서 난수를 얻을 수 있습니다. 더 보기...

헤더: #include <QRandomGenerator>
CMake: find_package(Qt6 REQUIRED COMPONENTS Core)
target_link_libraries(mytarget PRIVATE Qt6::Core)
qmake: QT += core
상속된 항목:

QRandomGenerator64

참고: 이 클래스의 모든 함수는 재진입 가능합니다.

참고: 다음 함수들은 스레드 안전성을 보장합니다:

공개 유형

공개 함수

QRandomGenerator(quint32 seedValue = 1)
QRandomGenerator(const quint32 (&seedBuffer)[N])
QRandomGenerator(std::seed_seq &sseq)
QRandomGenerator(const quint32 *begin, const quint32 *end)
QRandomGenerator(const quint32 *seedBuffer, qsizetype len)
QRandomGenerator(const QRandomGenerator &other)
~QRandomGenerator()
double bounded(double highest)
int bounded(int highest)
qint64 bounded(qint64 highest)
quint32 bounded(quint32 highest)
quint64 bounded(quint64 highest)
int bounded(int lowest, int highest)
qint64 bounded(int lowest, qint64 highest)
qint64 bounded(qint64 lowest, int highest)
qint64 bounded(qint64 lowest, qint64 highest)
quint32 bounded(quint32 lowest, quint32 highest)
quint64 bounded(quint64 lowest, quint64 highest)
quint64 bounded(quint64 lowest, unsigned int highest)
quint64 bounded(unsigned int lowest, quint64 highest)
void discard(unsigned long long z)
void fillRange(UInt (&buffer)[N])
void fillRange(UInt *buffer, qsizetype count)
quint64 generate64()
quint32 generate()
void generate(ForwardIterator begin, ForwardIterator end)
double generateDouble()
void seed(quint32 seed = 1)
void seed(std::seed_seq &seed)
QRandomGenerator::result_type operator()()

정적 공용 멤버

QRandomGenerator *global()
QRandomGenerator::result_type max()
QRandomGenerator::result_type min()
QRandomGenerator securelySeeded()
QRandomGenerator *system()
bool operator!=(const QRandomGenerator &rng1, const QRandomGenerator &rng2)

상세 설명

QRandomGenerator는 고품질의 난수 생성기를 사용하여 난수를 생성하는 데 사용할 수 있습니다. C++의 난수 엔진과 마찬가지로, QRandomGenerator는 생성자를 통해 사용자가 제공한 시드 값을 설정할 수 있습니다. 시드가 설정되면 이 클래스가 생성하는 숫자 시퀀스는 결정론적입니다. 즉, 동일한 시드 데이터가 주어지면 QRandomGenerator는 동일한 숫자 시퀀스를 생성합니다. 하지만 서로 다른 시드가 주어지면 결과는 상당히 달라져야 합니다.

QRandomGenerator::securelySeeded()를 사용하면 QRandomGenerator::system()을 통해 안전하게 시드가 설정된 QRandomGenerator를 생성할 수 있으며, 이는 이 클래스가 생성하는 숫자 시퀀스를 쉽게 예측할 수 없음을 의미합니다. 또한, ` QRandomGenerator::global()`는 Qt가 안전하게 시드되도록 보장하는 QRandomGenerator의 전역 인스턴스를 반환합니다. 이 객체는 스레드 안전하며, 대부분의 용도에서 공유할 수 있고, 항상 ` QRandomGenerator::system()`를 통해 시드됩니다.

QRandomGenerator::system()를 사용하여 시스템의 암호학적으로 안전한 난수 생성기에 접근할 수 있습니다. 유닉스 시스템에서는 /dev/urandom 에서 읽거나 getrandom() 또는 getentropy() 시스템 호출을 사용하는 것과 동일합니다.

이 클래스는 32비트 또는 64비트 값을 생성하거나, 해당 값으로 배열을 채울 수 있습니다. 새로운 값을 생성하는 가장 일반적인 방법은 generate(), generate64() 또는 fillRange() 함수를 호출하는 것입니다. 사용 방법은 다음과 같습니다:

    quint32 value = QRandomGenerator::global()->generate();

또한, [0, 1) 범위(즉, 0을 포함하고 1을 제외한 범위)의 숫자를 반환하는 부동 소수점 함수 ` generateDouble()`을 제공합니다. 또한, 제한된 정수 범위 내에서 난수를 쉽게 얻을 수 있도록 도와주는 일련의 편의 함수도 있습니다.

시드 설정 및 결정론

QRandomGenerator에는 특정 시드 데이터를 설정할 수 있습니다. 시드가 설정되면, 다음 예제와 같이 객체가 생성하는 숫자는 항상 동일해집니다:

    QRandomGenerator prng1(1234), prng2(1234);
    Q_ASSERT(prng1.generate() == prng2.generate());
    Q_ASSERT(prng1.generate64() == prng2.generate64());

시드 데이터는 하나 이상의 32비트 워드 형태를 띱니다. 이상적인 시드 크기는 QRandomGenerator 클래스 자체의 크기와 대략 같습니다. 시드 데이터가 혼합되기 때문에, QRandomGenerator는 서로 다른 시드가 서로 다른 시퀀스를 생성할 것이라고 보장할 수 없습니다.

QRandomGenerator::global()는 QRandomGenerator::securelySeeded()로 생성된 모든 생성기와 마찬가지로 항상 QRandomGenerator::system()에서 시드를 받기 때문에, 동일한 시퀀스를 생성하도록 만들 수는 없습니다.

대량 데이터

결정론적 모드에서 작동할 때, QRandomGenerator는 대량 데이터 생성에 사용될 수 있습니다. 실제로, 암호학적으로 안전한 데이터나 진정한 난수 데이터가 필요하지 않은 애플리케이션의 경우, 난수 데이터가 필요할 때 QRandomGenerator::system() 대신 일반 QRandomGenerator를 사용하는 것이 권장됩니다.

사용 편의성을 위해 QRandomGenerator는 다음 예제와 같이 쉽게 사용할 수 있는 전역 객체를 제공합니다:

    int x = QRandomGenerator::global()->generate();
    int y = QRandomGenerator::global()->generate();
    int w = QRandomGenerator::global()->bounded(16384);
    int h = QRandomGenerator::global()->bounded(16384);

시스템 전체 난수 생성기

QRandomGenerator::system()를 사용하면 시스템 전체에 적용되는 난수 생성기에 접근할 수 있으며, 이는 Qt가 실행되는 모든 시스템에서 암호학적으로 안전합니다. 이 함수는 가능한 경우 하드웨어 기능을 활용하여 난수를 생성합니다. 이러한 시스템에서 해당 기능은 진정한 난수 생성기(RNG)입니다. 그러나 진정한 RNG인 경우, 해당 기능은 유한한 엔트로피 소스를 가지고 있으므로 엔트로피 풀이 고갈되면 결과를 생성하지 못할 수도 있습니다.

이러한 상황이 발생하면, 먼저 운영 체제가, 그 다음으로 QRandomGenerator가 품질이 점차 떨어지는 의사 난수 생성기로 대체됩니다(Qt의 대체 생성기는 가장 단순한 방식입니다). 이러한 생성기가 여전히 암호학적으로 안전한 수준인지는 구현에 따라 다릅니다. 따라서, 엔트로피 풀이 고갈되는 것을 방지하기 위해 QRandomGenerator::system()는 고주파수 난수 생성에 사용되어서는 안 됩니다. 경험칙상, 이 클래스는 초당 1킬로바이트 이상의 난수 데이터를 생성하는 데 사용되어서는 안 됩니다(참고: 이는 시스템마다 다를 수 있습니다).

애플리케이션에서 대량의 진정한 난수(RNG) 데이터가 필요한 경우, 운영 체제 기능(예: 리눅스의 ` /dev/random `)을 직접 사용하고 엔트로피가 확보될 때까지 기다려야 합니다. 애플리케이션에 진정한 난수성은 필요하지 않지만 암호학적 품질을 갖춘 PRNG 엔진이 필요한 경우, ` QRandomGenerator::system()`를 계속 사용할 수 있습니다(아래 섹션 참조).

진정한 난수 생성기(RNG)나 암호학적으로 안전한 난수 생성기(CSPRNG)가 모두 필요하지 않은 경우, 애플리케이션은 대신 QRandomGenerator의 결정론적 모드와 같은 PRNG 엔진이나 C++ 표준 라이브러리의 PRNG 엔진을 사용해야 합니다. QRandomGenerator::system()를 사용하여 이러한 엔진에 시드를 설정할 수 있습니다.

대체 품질

QRandomGenerator::system()는 운영 체제 기능을 사용하여 난수를 얻으며, 이는 주변 환경에서 실제 엔트로피를 수집하여 진정한 난수를 생성하려고 시도합니다. 그러나 엔트로피 풀이 고갈될 가능성이 있으며, 이 경우 운영 체제는 일정 기간 동안 의사 난수 엔진으로 대체됩니다. QRandomGenerator::system()는 어떠한 경우에도 더 많은 엔트로피가 수집될 때까지 대기하며 실행을 차단하지 않습니다.

다음 운영 체제들은 엔트로피 풀이 고갈된 경우에도 난수 생성 API의 결과가 최소한 암호학적으로 안전한 품질을 갖출 것을 보장합니다: Apple OS(Darwin), BSD, Linux, Windows. 시스템 설치 문제(예: 현재 프로세스가 /dev/urandom 을 읽을 수 없는 경우)가 없는 한, QRandomGenerator::system()도 동일한 보장을 제공합니다.

다른 운영 체제에서는 QRandomGenerator가 수치 분포가 양호한 PRNG로 대체되지만, 모든 경우에서 적절한 시드 생성을 보장할 수는 없습니다. 자세한 내용은 해당 운영 체제 설명서를 참조하십시오.

QRandomGenerator가 암호화 등급에 미치지 못하는 생성기로 대체되지 않도록 해야 하는 애플리케이션의 경우, 운영 체제 문서를 확인하거나 배포를 위에서 언급한 운영 체제 중 하나로 제한하는 것이 좋습니다.

Qt 6.12부터 QRandomGenerator는 보안이 보장되지 않는 PRNG로 처음 대체될 때 stderr 에 경고를 출력합니다. Qt 빌드 중에 선택적 기능인 randomgenerator_disable_fallback 를 설정하여 보안이 보장되지 않는 대체 기능을 비활성화하고, QRandomGenerator를 사용하려고 시도했을 때 CSPRNG를 사용할 수 없는 경우 애플리케이션을 종료하도록 할 수 있습니다.

재입력 가능성과 스레드 안전성

QRandomGenerator는 재진입 가능하므로, 서로 다른 객체를 다루는 한 여러 스레드가 동시에 이 클래스를 사용할 수 있습니다. 여러 스레드가 하나의 PRNG 시퀀스를 공유해야 하는 경우, 뮤텍스를 통한 외부 잠금이 필요합니다.

단, ` QRandomGenerator::global()` 및 ` QRandomGenerator::system()`가 반환하는 객체는 예외입니다. 이 객체들은 스레드 안전하므로 외부 잠금 없이 어떤 스레드에서든 사용할 수 있습니다. 단, 스레드 안전성은 해당 객체의 복사에는 적용되지 않으므로, 항상 참조로 사용해야 합니다.

표준 C++ 라이브러리 호환성

QRandomGenerator는 C++ 표준 라이브러리의 난수 생성기 요구 사항을 모델로 하여 구현되었으며, 표준 라이브러리 생성기가 사용될 수 있는 거의 모든 상황에서 사용할 수 있습니다. 요구 사항에 대한 예외는 다음과 같습니다:

  • QRandomGenerator는 std::seed_seq 자체를 제외한 다른 시드 시퀀스형 클래스로부터의 시드 설정을 지원하지 않습니다.
  • QRandomGenerator는 std::ostream 또는 std::istream 와 비교할 수 없으며(단, 복사는 가능), 스트리밍도 지원하지 않습니다.

또한 QRandomGenerator는 균일 분포 클래스인 std::uniform_int_distribution 및 std:uniform_real_distribution, 그리고 자유 함수 std::generate_canonical 과 호환됩니다. 예를 들어, 다음 코드를 사용하여 [1, 2.5) 범위의 부동 소수점 숫자를 생성할 수 있습니다:

    std::uniform_real_distribution<> dist(1, 2.5);
    return dist(*QRandomGenerator::global());

QRandomGenerator64도 참조하십시오 .

멤버 유형 문서

QRandomGenerator::result_type

operator()가 반환하는 유형에 대한 typedef입니다. 즉, quint32입니다.

operator()도 참조하십시오 .

멤버 함수 설명

QRandomGenerator::QRandomGenerator(quint32 seedValue = 1)

이 QRandomGenerator 객체를 시드 값 seedValue 으로 초기화합니다. 동일한 시드 값으로 생성되거나 시드가 재설정된 두 객체는 동일한 숫자 시퀀스를 생성합니다.

seed() 및 securelySeeded()도 참조하십시오 .

template <qsizetype N> QRandomGenerator::QRandomGenerator(const quint32 (&seedBuffer)[N])

이 QRandomGenerator 객체를 배열 ` seedBuffer `에 포함된 값들을 시드로 사용하여 초기화합니다. 동일한 시드 값으로 생성되거나 시드가 재설정된 두 객체는 동일한 숫자 시퀀스를 생성합니다.

이 함수는 오버로드된 함수입니다.

seed() 및 securelySeeded()도 참조하십시오 .

[noexcept] QRandomGenerator::QRandomGenerator(std::seed_seq &sseq)

이 QRandomGenerator 객체를 시드 시퀀스 sseq 을 시드로 사용하여 초기화합니다. 동일한 시드 값으로 생성되거나 시드가 재설정된 두 객체는 동일한 숫자 시퀀스를 생성합니다.

이 함수는 오버로드된 함수입니다.

seed() 및 securelySeeded()도 참조하십시오 .

QRandomGenerator::QRandomGenerator(const quint32 *begin, const quint32 *end)

이 QRandomGenerator 객체를 begin 에서 end 사이의 값을 시드로 사용하여 초기화합니다. 동일한 시드 값으로 생성되거나 시드가 재설정된 두 객체는 동일한 숫자 시퀀스를 생성합니다.

이 생성자는 다음 코드와 동일합니다:

    std::seed_seq sseq(begin, end);
    QRandomGenerator generator(sseq);

이것은 오버로드된 함수입니다.

seed() 및 securelySeeded()도 참조하십시오 .

QRandomGenerator::QRandomGenerator(const quint32 *seedBuffer, qsizetype len)

이 QRandomGenerator 객체를 seedBuffer 배열에 있는 len 값을 시드로 사용하여 초기화합니다. 동일한 시드 값으로 생성되거나 시드가 재설정된 두 객체는 동일한 숫자 시퀀스를 생성합니다.

이 생성자는 다음 코드와 동일합니다:

    std::seed_seq sseq(seedBuffer, seedBuffer + len);
    QRandomGenerator generator(sseq);

이것은 오버로드된 함수입니다.

seed() 및 securelySeeded()도 참조하십시오 .

QRandomGenerator::QRandomGenerator(const QRandomGenerator &other)

other 객체의 생성기 상태 사본을 생성합니다. other 가 QRandomGenerator::system()이거나 그 사본인 경우, 이 객체도 운영 체제의 난수 생성 기능을 통해 데이터를 읽게 됩니다. 이 경우 두 객체가 생성하는 시퀀스는 서로 달라집니다.

그 외의 모든 경우, 새로운 QRandomGenerator 객체는 other 객체가 있던 것과 동일한 위치에서 결정론적 시퀀스를 시작합니다. 이 시점부터 두 객체는 동일한 시퀀스를 생성합니다.

이러한 이유로 QRandomGenerator::global()의 복사본을 생성하는 것은 권장되지 않습니다. 전용 결정론적 생성기가 필요한 경우, 대신 securelySeeded()를 사용하여 QRandomGenerator::global()과 아무런 관련이 없는 새로운 객체를 생성하는 것을 고려해 보십시오.

[constexpr noexcept default] QRandomGenerator::~QRandomGenerator()

QRandomGenerator 의 인스턴스를 삭제합니다.

double QRandomGenerator::bounded(double highest)

0(포함)부터 highest (제외) 사이의 범위에서 임의의 double형 숫자 하나를 생성합니다. 이 함수는 다음 코드와 동일하며 다음과 같이 구현됩니다:

    return generateDouble() * highest;

highest 매개변수가 음수인 경우 결과도 음수가 되며, 무한대이거나 NaN인 경우 결과도 무한대이거나 NaN이 됩니다(즉, 무작위 결과가 아닙니다).

generateDouble() 및 bounded(quint64)도 참조하십시오 .

int QRandomGenerator::bounded(int highest)

0(포함)부터 highest (제외) 사이의 범위에서 32비트 무작위 수치를 하나 생성합니다. highest 는 양수여야 합니다.

이 함수는 int의 전체 32비트 범위에 속하는 값을 얻는 데 사용할 수 없다는 점에 유의하십시오. 대신 generate()를 사용하고 int로 형변환하십시오.

이 함수는 오버로드된 함수입니다.

generate(), generate64(), generateDouble()도 참조하십시오 .

qint64 QRandomGenerator::bounded(qint64 highest)

0(포함)부터 highest (제외) 사이의 범위에서 64비트 무작위 수치를 하나 생성합니다. highest 는 양수여야 합니다.

이 함수는 qint64 의 전체 64비트 범위 내 값을 얻는 데 사용할 수 없다는 점에 유의하십시오. 대신 generate64()를 사용하여 qint64로 형변환하거나, 이 함수의 부호 없는 버전을 사용하십시오.

참고: 이 함수는 얻은 난수 값에 따라 달라지는 루프 형태로 구현되어 있습니다. 장기적으로 볼 때 평균적으로 2회 미만으로 루프가 반복되어야 하지만, 난수 생성기에 결함이 있는 경우 이 함수의 실행 시간이 상당히 길어질 수 있습니다.

이 함수는 오버로드된 함수입니다.

generate(), generate64(), generateDouble()도 참조하십시오 .

quint32 QRandomGenerator::bounded(quint32 highest)

0(포함)부터 highest (제외) 사이의 범위에서 32비트 무작위 수치를 하나 생성합니다. 다음 매개변수(0 및 )를 사용하여 std::uniform_int_distribution 매개변수로 0과 highest - 1 을 지정하여 얻을 수도 있습니다. 이 클래스는 32비트보다 큰 수치를 얻는 데에도 사용할 수 있으며, 64비트의 경우 64비트 bounded() 오버로드를 사용할 수도 있습니다.

예를 들어, 0에서 255(포함) 사이의 값을 얻으려면 다음과 같이 작성하면 됩니다:

    quint32 v = QRandomGenerator::global()->bounded(256);

당연히, generate()의 결과값에서 하위 8비트만 추출하는 방식으로 동일한 결과를 얻을 수도 있습니다. 두 방법 모두 동일한 효율을 보입니다.

이 함수는 quint32의 전체 32비트 범위에 해당하는 값을 구하는 데 사용할 수 없다는 점에 유의하십시오. 대신 generate()을 사용하십시오.

이 함수는 오버로드된 함수입니다.

generate(), generate64(), generateDouble()도 참조하십시오 .

quint64 QRandomGenerator::bounded(quint64 highest)

0(포함)부터 highest (제외) 사이의 범위에서 64비트 임의의 수를 하나 생성합니다. 다음을 사용하여도 동일한 결과를 얻을 수 있습니다. std::uniform_int_distribution<quint64> 매개변수로 0과 highest - 1 을 지정하여 동일한 결과를 얻을 수도 있습니다.

이 함수는 quint64 의 전체 64비트 범위 내의 값을 얻는 데 사용할 수 없다는 점에 유의하십시오. 대신 generate64()를 사용하십시오.

참고: 이 함수는 얻은 난수 값에 따라 달라지는 루프 형태로 구현되었습니다. 장기적으로 볼 때 평균적으로 2회 미만으로 반복되어야 하지만, 난수 생성기에 결함이 있는 경우 이 함수의 실행 시간이 상당히 길어질 수 있습니다.

이 함수는 오버로드된 함수입니다.

generate(), generate64(), generateDouble()도 참조하십시오 .

int QRandomGenerator::bounded(int lowest, int highest)

lowest (포함)과 highest (제외) 사이의 범위에서 32비트 무작위 수치를 하나 생성합니다. 두 값 모두 음수일 수 있지만, highest 는 lowest 보다 커야 합니다.

이 함수는 int의 전체 32비트 범위에 속하는 값을 얻는 데 사용할 수 없습니다. 대신 generate()를 사용하고 int로 형변환하십시오.

이 함수는 오버로드된 함수입니다.

generate(), generate64(), generateDouble()도 참조하십시오 .

qint64 QRandomGenerator::bounded(int lowest, qint64 highest)

qint64 QRandomGenerator::bounded(qint64 lowest, int highest)

quint64 QRandomGenerator::bounded(quint64 lowest, unsigned int highest)

quint64 QRandomGenerator::bounded(unsigned int lowest, quint64 highest)

이 함수는 매개변수의 유형이 정확히 일치하지 않을 때 오버로드 해결을 돕기 위해 존재합니다. 이 함수는 더 작은 유형을 더 큰 유형으로 승격시킨 후 올바른 오버로드를 호출합니다.

qint64 QRandomGenerator::bounded(qint64 lowest, qint64 highest)

lowest (포함)과 highest (제외) 사이의 범위에서 64비트 무작위 수치를 하나 생성합니다. 두 값 모두 음수일 수 있으나, highest 는 lowest 보다 커야 합니다.

이 함수는 qint64 의 전체 64비트 범위 내의 값을 얻는 데 사용할 수 없다는 점에 유의하십시오. 대신 generate64()를 사용하고 qint64로 형변환하십시오.

참고: 이 함수는 얻은 난수 값에 따라 달라지는 루프 형태로 구현되었습니다. 장기적으로 볼 때 평균적으로 2회 미만으로 루프가 반복되어야 하지만, 난수 생성기에 결함이 있는 경우 이 함수의 실행 시간이 상당히 길어질 수 있습니다.

이 함수는 오버로드된 함수입니다.

generate(), generate64(), generateDouble()도 참조하십시오 .

quint32 QRandomGenerator::bounded(quint32 lowest, quint32 highest)

lowest (포함)과 highest (제외) 사이의 범위에서 32비트 무작위 수치를 하나 생성합니다. highest 매개변수는 lowest 보다 커야 합니다.

다음과 같은 매개변수를 사용하여도 동일한 결과를 얻을 수 있습니다. std::uniform_int_distributionlowest 및 \a highest - 1 매개변수를 사용하여 동일한 결과를 얻을 수도 있습니다. 이 클래스는 32비트보다 큰 수치를 얻는 데에도 사용할 수 있습니다.

예를 들어, 1000(포함)과 2000(제외) 사이의 값을 얻으려면 다음과 같이 작성합니다:

    quint32 v = QRandomGenerator::global()->bounded(1000, 2000);

이 함수는 quint32의 전체 32비트 범위에 해당하는 값을 구하는 데 사용할 수 없다는 점에 유의하십시오. 대신 generate()를 사용하십시오.

이 함수는 오버로드된 함수입니다.

generate(), generate64(), generateDouble()도 참조하십시오 .

quint64 QRandomGenerator::bounded(quint64 lowest, quint64 highest)

lowest (포함)과 highest (제외) 사이의 범위에서 64비트 임의의 수를 하나 생성합니다. highest 매개변수는 lowest 보다 커야 합니다.

다음과 같은 매개변수를 사용하여도 동일한 결과를 얻을 수 있습니다. std::uniform_int_distribution<quint64>lowest 및 \a highest - 1 매개변수를 사용하여 동일한 결과를 얻을 수도 있습니다.

이 함수는 quint64 의 전체 64비트 범위 값을 얻는 데 사용할 수 없다는 점에 유의하십시오. 대신 generate64()를 사용하십시오.

참고: 이 함수는 얻은 난수 값에 따라 달라지는 루프로 구현되어 있습니다. 장기적으로 볼 때 평균적으로 2회 미만으로 루프가 반복되어야 하지만, 난수 생성기에 결함이 있는 경우 이 함수의 실행 시간이 상당히 길어질 수 있습니다.

이 함수는 오버로드된 함수입니다.

generate(), generate64() 및 generateDouble()도 참조하십시오 .

void QRandomGenerator::discard(unsigned long long z)

시퀀스에서 다음 z 개의 항을 제거합니다. 이 메서드는 다음과 같이 generate()을 z 번 호출한 후 결과를 버리는 것과 동일합니다.

    while (z--)
        generator.generate();

template < typename UInt, size_t N, QRandomGenerator::IfValidUInt<UInt> = true > void QRandomGenerator::fillRange(UInt (&buffer)[N])

N 의 32비트 또는 64비트 수량( UInt 의 유형에 따라 다름)을 생성하여 buffer 배열에 저장합니다. 이는 난수 생성기 소스 호출 횟수를 줄여주므로, 한 번에 여러 수량을 얻는 가장 효율적인 방법입니다.

예를 들어, 두 개의 32비트 수치를 생성하려면 다음과 같이 작성할 수 있습니다:

    quint32 array[2];
    QRandomGenerator::global()->fillRange(array);

generate64()를 한 번 호출한 다음 64비트 값을 두 부분으로 나누는 방법도 가능했을 것입니다.

generate()도 참조하십시오 .

template <typename UInt, QRandomGenerator::IfValidUInt<UInt> = true> void QRandomGenerator::fillRange(UInt *buffer, qsizetype count)

count 의 32비트 또는 64비트 수량( UInt 의 유형에 따라 다름)을 생성하여 buffer 가 가리키는 버퍼에 저장합니다. 이는 난수 생성기 소스 호출 횟수를 줄여주므로, 한 번에 여러 수량을 얻는 가장 효율적인 방법입니다.

예를 들어, 16개의 항목으로 구성된 리스트를 난수 값으로 채우려면 다음과 같이 작성할 수 있습니다:

    QList<quint32> list;
    list.resize(16);
    QRandomGenerator::global()->fillRange(list.data(), list.size());

generate()도 참조하십시오 .

quint64 QRandomGenerator::generate64()

64비트 난수를 생성하여 반환합니다.

operator()() 및 generate()도 참조하십시오 .

quint32 QRandomGenerator::generate()

32비트 난수를 생성하여 반환합니다.

operator()() 및 generate64()도 참조하십시오 .

template <typename ForwardIterator> void QRandomGenerator::generate(ForwardIterator begin, ForwardIterator end)

32비트 수치를 생성하여 begin 과 end 사이의 범위에 저장합니다. 이 함수는 다음 함수와 동일하며(다음 함수로 구현됨):

    std::generate(begin, end, [this]() { return generate(); });

이 함수는 std::seed_seq::generate의 요구 사항을 준수하며, 이 함수는 부호 없는 32비트 정수 값을 필요로 합니다.

[begin, end) 범위가 요소당 32비트 이상을 저장할 수 있는 영역을 가리키는 경우에도, 요소들은 여전히 32비트의 데이터로만 초기화된다는 점에 유의하십시오. 나머지 비트는 0으로 설정됩니다. 이 범위를 64비트 수량으로 채우려면 다음과 같이 작성할 수 있습니다:

    std::generate(begin, end, []() { return QRandomGenerator::global()->generate64(); });

범위가 연속된 메모리(예: 배열이나 ` QList`의 데이터)를 가리키는 경우, ` fillRange()` 함수도 사용할 수 있습니다.

fillRange()도 참조하십시오 .

double QRandomGenerator::generateDouble()

표준 범위 [0, 1) (즉, 0을 포함하고 1을 제외한 범위) 내에서 qreal형 난수를 하나 생성합니다.

이 함수는 다음과 동일합니다:

    QRandomGenerator64 rd;
    return std::generate_canonical<qreal, std::numeric_limits<qreal>::digits>(rd);

다음과 같은 방식으로도 동일한 결과를 얻을 수 있습니다. std::uniform_real_distribution 매개변수 0과 1을 사용하여 얻을 수도 있습니다.

generate(), generate64(), bounded()도 참조하십시오 .

[static] QRandomGenerator *QRandomGenerator::global()

securelySeeded()를 사용하여 시드(seed)가 설정된 공유 QRandomGenerator 객체에 대한 포인터를 반환합니다. 이 함수는 특정 용도를 위해 보안 시드가 설정된 QRandomGenerator 객체를 생성하는 데 드는 높은 비용이나, 상당히 큰 QRandomGenerator 객체를 저장하는 번거로움 없이 난수 데이터를 생성할 때 사용해야 합니다.

예를 들어, 다음 코드는 무작위 RGB 색상을 생성합니다:

    return QColor::fromRgb(QRandomGenerator::global()->generate());

이 객체에 대한 액세스는 스레드 안전하므로, 잠금(lock) 없이 어떤 스레드에서든 사용할 수 있습니다. 또한 이 객체를 복사할 수 있으며, 복사본에서 생성되는 시퀀스는 공유 객체에서 생성되는 시퀀스와 동일합니다. 다만, 다른 스레드가 전역 객체에 액세스하고 있는 경우, 해당 스레드들은 예측할 수 없는 간격으로 샘플을 얻을 수 있다는 점에 유의하십시오.

참고: 이 함수는 스레드 안전합니다.

securelySeeded() 및 system()도 참조하십시오 .

[static constexpr] QRandomGenerator::result_type QRandomGenerator::max()

QRandomGenerator 가 생성할 수 있는 최대 값을 반환합니다. 즉, std::numeric_limits<result_type>::max() 입니다.

min()도 참조하십시오 .

[static constexpr] QRandomGenerator::result_type QRandomGenerator::min()

QRandomGenerator 가 생성할 수 있는 최소값을 반환합니다. 즉, 0입니다.

max()도 참조하십시오 .

[static] QRandomGenerator QRandomGenerator::securelySeeded()

QRandomGenerator::system()를 사용하여 안전하게 시드된 새로운 QRandomGenerator 객체를 반환합니다. 이 함수는 QRandomGenerator 에서 사용하는 알고리즘에 적합한 이상적인 시드 크기를 확보하므로, 장기간 유지할 새로운 QRandomGenerator 객체를 생성할 때 권장되는 방법입니다.

결정론적 엔진을 안전하게 초기화하는 데 필요한 데이터 양을 고려할 때, 이 함수는 다소 비용이 많이 들므로 QRandomGenerator 를 단기간 사용하는 용도로는 사용해서는 안 됩니다(2600바이트 미만의 난수 데이터를 생성하는 데 이 함수를 사용하는 것은 사실상 자원 낭비입니다). 사용 목적상 그 정도의 데이터가 필요하지 않다면, 대신 QRandomGenerator::global()를 사용하고 QRandomGenerator 객체를 저장하지 않는 것을 고려해 보십시오.

global() 및 system()도 참조하십시오 .

void QRandomGenerator::seed(quint32 seed = 1)

seed 값을 시드로 사용하여 이 객체를 다시 초기화합니다.

[noexcept] void QRandomGenerator::seed(std::seed_seq &seed)

seed 시드 시퀀스를 시드로 사용하여 이 객체를 다시 시드합니다.

이 함수는 오버로드된 함수입니다.

[static] QRandomGenerator *QRandomGenerator::system()

운영 체제가 제공하는 기능을 항상 사용하여 난수를 생성하는 공유 QRandomGenerator 에 대한 포인터를 반환합니다. 이러한 시스템 기능은 최소한 다음 운영 체제에서 암호학적으로 안전한 것으로 간주됩니다: Apple OS(Darwin), BSD, Linux, Windows. 다른 운영 체제에서도 마찬가지일 수 있습니다.

또한 이러한 기능은 실제 하드웨어 난수 생성기에 의해 뒷받침될 가능성도 있습니다. 이러한 이유로, 이 함수가 반환하는 ` QRandomGenerator `는 대량의 데이터를 생성하는 데 사용해서는 안 됩니다. 대신, ` QRandomGenerator ` 또는 `<random>` 헤더의 난수 엔진에 시드 값을 설정하는 데 사용하십시오.

이 함수가 반환하는 객체는 스레드 안전하며, 잠금(lock) 없이 어떤 스레드에서든 사용할 수 있습니다. 또한 이 객체를 복사할 수 있으며, 그 결과로 생성된 QRandomGenerator 도 운영 체제 기능을 사용하지만, 동일한 시퀀스를 생성하지는 않습니다.

참고: 이 함수는 스레드 안전합니다.

securelySeeded() 및 global()도 참조하십시오 .

QRandomGenerator::result_type QRandomGenerator::operator()()

32비트 난수를 생성하여 반환합니다.

generate() 및 generate64()도 참조하십시오 .

관련 비회원

bool operator!=(const QRandomGenerator &rng1, const QRandomGenerator &rng2)

rng1 와 rng2 라는 두 엔진의 상태가 서로 다르거나, 둘 중 하나가 운영 체제 기능을 통해 데이터를 읽는 중이고 다른 하나는 그렇지 않은 경우 ` true `를 반환하며, 그 외의 경우에는 ` false `를 반환합니다.

© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.