웹사이트 검색

C++에서 난수 생성기를 만드는 방법


이 기사에서는 C++에서 난수 생성기를 만드는 데 필요한 함수를 살펴보겠습니다. 컴퓨터 세계에서 난수는 익명성과 보안성을 더하는 필수 구성 요소입니다.

난수 생성기는 의사 난수 생성의 중추를 형성합니다.

의사 난수 뒤에 있는 아이디어는 컴퓨터가 난수를 선택하는 사고 과정이 없다는 것입니다. 따라서 생성된 출력 숫자가 무작위로 보일 수 있지만 값은 수학적으로 계산됩니다.

srand() 및 rand() 함수

C++의 srand() 함수는 의사 난수 계산을 수행할 수 있습니다. 이 함수에는 난수 계산의 기초가 되는 시드 값이 필요합니다.

srand(unsigned int seed_value)

시드 값의 도움으로 srand()rand() 함수에 의한 의사 난수 생성을 위한 단계를 설정합니다.

int random = rand();

짜잔! 우리는 난수를 생성하는 간단한 작업을 달성했습니다. 그러나 어려운 부분은 난수 생성기의 개념을 이해하는 것입니다.

종자 가치의 중요성

시드 값은 일련의 난수에 대한 키를 보유합니다. 동일한 시드 값이 함수에 제공되는 경우 계산된 숫자 집합은 비슷합니다.

srand() 함수의 기본 시드 값은 1이므로 새로운 시드 값을 제공하지 않고 rand() 함수를 호출하면 여전히 난수 문자열을 가져옵니다. 여기서 문제는 시드 값으로 프로그램을 실행할 때마다 출력이 동일하게 유지된다는 것입니다.

우리 문제에 대한 간단한 해결책은 프로그램을 실행할 때마다 새로운 시드 값을 사용하는 것입니다. 매 초마다 무엇이 바뀌나요? - 시간. 현재 타임스탬프가 현재 시드 값이라는 개념을 사용했습니다.

다음을 사용하여 타임스탬프를 만들 수 있습니다.

time_t current_time = time(NULL);

current_time 변수는 1970년 1월 이후 경과된 초 수를 보유합니다. 이 값은 srand() 함수에 전달된 다음 새로운 의사 난수 시퀀스를 얻습니다. .

변수에 대한 타임스탬프 초기화를 건너뛰고 단순히 타임스탬프를 함수에 전달할 수 있습니다.

srand((unsigned) time(NULL));

시드 값은 생성할 난수 수에 관계없이 프로그램에서 한 번만 제공됩니다.

C++에서 완벽한 난수 생성기 만들기

다음 코드는 난수의 적절한 생성을 보여줍니다.

#include<iostream>
#include<cstdlib>
using namespace std;

int main(){

	// Providing a seed value
	srand((unsigned) time(NULL));

	// Get a random number
	int random = rand();

	// Print the random number
	cout<<random<<endl;

	return 1;
}

산출:

1897776064

생성된 숫자가 일반 계산에서 적절하게 사용하기에는 너무 큽니다.

범위 내에서 난수 생성

특정 범위 내에서 난수를 제한할 필요가 있습니다. 이 특정 목적을 위해 모듈러스 % 연산자를 사용합니다.

예를 들어 0에서 9까지의 난수를 생성하기 위해 다음을 사용할 수 있습니다.

int random = rand() % 10;

마찬가지로 1에서 9까지의 난수를 가져와야 하는 경우 다음을 사용합니다.

int random = 1 + (rand() % 9);

일반 방정식은 다음과 같이 나타낼 수 있습니다.

int random = offset + (rand() % range);

위 방정식에서:

  • 오프셋 - 난수 범위의 시작점
  • 범위 - 한계를 포함하여 첫 번째와 마지막 가능한 난수 사이의 값 수

예를 들어, 10 - 100 사이의 난수 집합에서 오프셋은 10이고 범위는 91입니다.

100에서 200 사이의 난수 5개를 출력하는 프로그램의 예를 실행해 보겠습니다.

#include<iostream>
#include<cstdlib>
using namespace std;

int main(){

	// Providing a seed value
	srand((unsigned) time(NULL));

	// Loop to get 5 random numbers
	for(int i=1; i<=5; i++){
		
		// Retrieve a random number between 100 and 200
		// Offset = 100
		// Range = 101
		int random = 100 + (rand() % 101);

		// Print the random number
		cout<<random<<endl;
	}

	return 1;
}

산출:

144
175
162
137
200

명확히 하기 위해, 시드 값이 제공되지 않으면 위 프로그램의 출력은 실행할 때마다 동일합니다. 세트 내의 난수는 다르지만 전체 세트는 동일합니다.

난수 생성기(RNG)의 응용

난수 생성의 힘은 제한적으로 보일 수 있지만 그렇지 않습니다. 따라서 RNG의 몇 가지 용도를 살펴보겠습니다.

암호화

예측 불가능성은 암호화 분야에서 보안의 척도로 간주됩니다. 따라서 키 및 nonce와 같은 난수 생성기가 많이 사용됩니다.

계략

전통적인 게임에는 주사위와 카드 섞기가 포함되어 게임에 무작위성을 도입하여 재미 있고 불확실한 결과를 추가했습니다. 마찬가지로 현대 게임 개발에는 게임에 추가 차원을 추가하는 사전 및 사후 무작위성 개념이 있습니다.

무작위 알고리즘

이러한 알고리즘에는 이미 알려진 알고리즘에 어느 정도의 임의성이 도입되었습니다. 가장 중요한 것은 이러한 알고리즘의 목적이 성공 확률을 절충하여 더 나은 성능을 달성하는 것입니다.

결론

RNG 또는 PRNG(의사 난수 생성기)는 최신 사이버 보안 및 암호화의 빌딩 블록입니다. 이러한 RNG의 기본 원리는 무작위로 보이는 다른 숫자를 제공하는 일부 계산에 있습니다.

독자가 이 기사를 이해할 수 있기를 바랍니다. 질문이나 제안 사항이 있으면 아래에 자유롭게 의견을 말하십시오.