C++에서 주사위 굴림으로 임의 값 생성
컴퓨터는 숫자를 추측할 수 없습니다. 기계가 난수를 생성할 때마다 그것은 비트 연산의 산물이거나 수치적 요인, 즉 시간, 시퀀스의 파생물입니다.
위의 방법을 사용할 때의 문제는 충분히 반복하면 동일한 결과 집합이 생성된다는 것입니다.
이것이 난수를 생성하는 데 사용되는 기존 알고리즘이 암호화 관행에 권장되지 않는 이유입니다. 결과는 쉽게 예측할 수 있습니다.
무작위성을 예측할 때 주사위를 굴리는 것은 매우 간단한 작업입니다. 이 기사에서 독자는 컴퓨터의 무작위성에 대해 배우고 C++를 사용하여 간단한 주사위 굴림에서 무작위 결과를 가져오는 방법을 배웁니다.
C++에서 주사위 굴림으로 난수 생성
의사 난수 생성기는 무작위로 보이는 숫자를 생성하는 기계입니다. 반대로, 그것들은 완전히 예측 가능합니다.
이는 기존의 난수 생성기가 시드를 사용하기 때문입니다. 시드(seed)는 간단히 말해서 시간 또는 숫자 구성요소에 의존하는 주입 함수입니다.
예를 들어, f(x0)
라고 하는 주입 기능을 x(0)
에 반복적으로 적용하여 주어진 시드 x(0)
에 대해 생성된 결과는 fn(x0)
이 fn-1(x0)
또는 fn+1(x0)
, 여기서 fn
은 함수 구조 n
번을 나타냅니다.
즉, f(x)
는 이전의 것과 실질적으로 관련이 없는 큰 도약을 포함합니다.
시간을 사용하여 C++에서 주사위 굴림에 대한 난수 생성 시드
대부분의 경우 생성된 시드는 시간 요소에 따라 다릅니다. 즉, 주입 기능은 시계의 현재 초를 고려합니다.
더 나은 방법으로 이해하기 위해 예를 살펴 보겠습니다.
unsigned main_seed;
main_seed = time(0);
srand(main_seed);
여기에서 부호 없는 변수 main_seed
가 초기화됩니다. 이 변수는 현재 시간을 저장하는 데 사용됩니다. srand()
는 시드에서 결과를 생성하는 C++ 함수입니다.
시드가 생성되면 rand()
함수를 시드로 사용하여 선형 방정식을 사용하여 임의의 값을 생성할 수 있습니다.
고유한 시드를 가져오기 위해 시간 요소를 사용하는 것은 최신 CPU가 프로세스를 나노초 단위로 처리하여 무작위성 측면에서 전체 기능을 방해하기 때문에 관련되지 않는 한 좋은 관행으로 보일 수 있습니다.
대부분의 경우 생성된 시드는 시간 요소에 따라 다릅니다. 즉, 주입 기능은 시계의 현재 초를 고려합니다.
시계가 생각만큼 빠르지 않기 때문에 srand(time)
을 1초에 여러 번 사용하면 동일한 시드를 여러 번 얻습니다. 결과적으로 생성된 난수 집합은 유사합니다.
그리고 이것은 특히 블록 암호 프로그램에서 (중요한) 문제가 될 수 있습니다. 후자의 경우 사람들은 대기 데이터의 온도 변화 등과 같은 실시간 물리적 형용사를 기반으로 구축된 적절한 수의 발전기를 구입하거나, 최근에는 편광된 광자가 어떻게 중첩되는지에 대한 요인과 같은 양자 비트 측정을 기반으로 발전기를 구입합니다.
임의의 숫자를 사용하여 C++에서 주사위 굴림을 위한 난수 생성 시드
아래 예는 숫자를 사용하는 의사 숫자 생성기를 보여줍니다.
static unsigned long int rand_num = 2;
int rand(void) // The ceiling limit is kept at 32767
{
rand_num = rand_num * 113546545 + 12345;
return (unsigned int)(rand_num / 65536) % 32768;
}
void srand(unsigned int main_seed) // seed is stored inside variable main_seed
{
rand_num = main_seed;
}
부호 없는 int 변수 rand_num
은 2
값으로 초기화됩니다. 위의 프로그램에는 rand
와 srand
의 두 가지 방법이 있습니다.
rand
메서드는 새 숫자를 초기화된 값에 연결합니다. 시드의 상한선이 설정되면 rand
모드와 상한선은 상한선보다 낮은 숫자를 반환합니다.
이 메서드에서 반환된 최종 결과는 unsigned int로 형변환됩니다.
srand()
메소드는 rand_num
의 값을 시드 변수 main_seed
로 전달합니다.
위의 방법을 사용할 때의 단점
알 수 있듯이 srand(time(0))
를 실행하거나 seed에 대해 임의의 값을 취하면 항상 rand()
에 새로운 숫자가 반환되며 이는 seed에 종속됩니다. 그러나 몇 백만 후에는 숫자가 반복됩니다.
시드(seed)는 순서대로 생성되는 임의의 숫자를 제어합니다. 즉, srand(1)
는 rand()
에 대한 첫 번째 호출에서 거의 항상 동일한 값을 생성하고 rand()
에 대한 두 번째 호출에서 동일한 숫자를 생성합니다. , 등등.
즉, 각 rand()
호출 전에 동일한 시드가 다시 시드되는 경우 출력은 항상 동일한 난수입니다. 따라서 1초에 time(0)
으로 여러 번 시딩하면 다시 시딩 후 모든 난수가 동일하게 됩니다.
몇 주기 후에 반복해야 하지만 srand
인수가 패턴을 정의합니다. C++ rand
는 시드를 알면 해커가 다음 숫자를 추정하는 데 도움이 되므로 암호화에 적합하지 않습니다.
C++를 사용하여 주사위 굴림과 유사한 임의 값 생성
이 프로그램은 시간 생성 시드를 사용하여 1에서 6 사이의 난수를 생성합니다.
패키지 가져오기
이 프로그램에는 세 가지 가져오기 패키지가 필요합니다.
아이오스트림
cstdlib
- 시간 함수 및 랜드 연산용time
- 시간 함수용 헤더 패키지
‘iostream’은 프로그램의 입출력 작업을 위해 가져옵니다. 다른 패키지인 cstdlib
는 C++ 프로그램의 기본 제어 작업에 사용됩니다.
세 번째 패키지는 프로그램의 시드를 만드는 데 사용할 time
패키지입니다.
C++에서 다이 롤에 따라 값 생성
주사위에는 6개의 개별 값이 있습니다. 프로그램의 역할은 범위 내에서 임의의 자연수를 생성하는 것이어야 하며, 이는 후속 주사위 굴림에서 반복될 수 있지만 전체 결과는 순전히 무작위로 보여야 합니다.
결과를 찾기 위해 3개의 변수가 초기화됩니다. floor
및 ceiling
변수는 주사위의 가장 낮은 값과 가장 높은 값을 저장하고 변수 outcome
은 난수를 찾는 데 사용됩니다.
int outcome;
int l_limit = 1;
int h_limit = 6;
최종 값은 rand()
함수를 사용하여 생성되어 결과를 상한 및 하한 범위 내로 제한합니다.
outcome = rand() % (max - min + 1) + min;
마지막으로 변수 roll
이 반환됩니다.
int outcome;
int l_limit = 1; // floor or lower limit of a die
int h_limit = 6; // ceiling or higher limit of a die
outcome = rand() % (h_limit - l_limit + 1) + l_limit;
return outcome;
시간을 사용하여 시드 생성 및 결과 표시
프로그램은 srand()
함수 내에서 현재 시간을 가져와 rand()
함수에 전달합니다. 애플리케이션은 Droll()
메소드의 rand()
함수를 사용하여 규정된 한계 내에서 자연수를 찾습니다.
srand(time(0));
시드가 생성된 후 Droll()
메서드를 호출하고 결과를 인쇄해야 합니다.
일반적으로 3개의 다이 롤은 항상 완전한 세트로 간주됩니다. 이 기술은 임의성을 확인하기 위해 세 번 반복됩니다.
Droll()
메서드를 for
루프에 넣고 print
문 내에서 세 번 호출해야 합니다. 최종 결과는 주사위 롤에서 생성된 의사 난수의 3X3 행렬입니다.
for (int i = 0; i < 3; i++) {
std::cout << Droll() << " ";
std::cout << Droll() << " ";
std::cout << Droll() << std::endl;
}
프로그램 안에 모든 것을 넣고 결과를 보자.
#include <cstdlib>
#include <iostream>
#include "time.h"
int Droll() {
int outcome;
int l_limit = 1; // floor or lower limit of a die
int h_limit = 6; // ceiling or higher limit of a die
outcome = rand() % (h_limit - l_limit + 1) + l_limit;
return outcome;
}
int main() {
srand(time(0));
for (int i = 0; i < 3; i++) {
std::cout << Droll() << " ";
std::cout << Droll() << " ";
std::cout << Droll() << std::endl;
}
}
출력:
3 1 2
6 1 3
4 5 4
--------------------------------
Process exited after 0.00784 seconds with return value 0
Press any key to continue . . .
결론
이 기사에서는 의사 숫자 생성기의 기본 사항을 설명했습니다. 독자들은 난수를 생성하는 다양한 방법과 그 장점과 단점을 보았습니다.
범위 내에서 난수가 생성되는 방법과 컴퓨터 프로그램을 사용하여 주사위 굴림을 모방할 수 있는 방법에 대한 개념을 명확하게 하기 위해 C++ 프로그램이 제공됩니다.