x0FANSA-hk 님의 블로그
n자리 난수생성기 본문
결론부터 말해서 그런거 없습니다.
사람들에게 난수를 고르라고 한다면 눈을 가리고 랜덤의 숫자 하나를 뽑는 방법으로 무작위 중 하나의 숫자를 선택할 것입니다. 난수의 핵심은 무작위성인데요, 즉 다음에 나올 수가 절대로 예측불가능한 숫자여야 합니다. 그렇기에 눈가리기 방식은 진정한 난수를 고르는 방식이죠. 그러나, 여기서 컴퓨터를 생각해봅시다. 컴퓨터는 계산기입니다. 우리가 1+1을 넣으면 반드시 2가 되는거처럼 정해진 입력에는 정해진 답을 내놓는 건바이건인거죠. 즉 컴퓨터 알고리즘으로만 난수를 만든다? → 불가능합니다.

그러면 컴퓨터로 난수를 출력해내고 싶으면 어떻게 하면 될까요? 의외로 간단합니다. 컴퓨터는 난수는 못만들지만 인간의 입력에따라 제각각 다른 결과를 내놓습니다. 그렇기에 우리'인간'이 무의식적으로 무작위로 선택한 것을 컴퓨터가 적절히 변환해서 보여주면 됩니다. 예시를 들자면 실제로도 일부 알고리즘(의사 난수, Pseudo-Random Number)은 "사용자가 마우스를 누르는 시간"이라는 데이터를 정해진 수식에 넣어 그에 맞는 난수를 만들어냅니다. 즉 컴퓨터에게 완전한 난수는 없습니다. 사람이나 환경이 무의식적으로 무작위로 하는것을 난수라는 이름으로 보여줄 뿐이죠.
그러나 만약 출력 알고리즘이 극도로 단순하다면 난수라고 내놓은 결과가 특정 값에만 편향된 상황도 있을 수 있습니다. 따라서 적절히 빠르면서 최대한 많은 경우를 만들어 내는 알고리즘이 난수 알고리즘의 핵심입니다.
질문: 그러면 난수화 알고리즘을 알고 특정 환경에 정확한 조건으로 입력을 하면 항상 의도된 같은 값이 나올까요?
→ 네 됩니다. 드럽게 어려울 뿐
결론: 고전컴퓨터 내 진정한 난수 생성기는 없습니다. 무수히 많은 경우의 수만 있을 뿐이지요.
즉 아래의 파일도 사용자가 실행을 하는 순간의 여러가지 요소의 값을 추출하고 이 값들을 정해진 식에 대입하여 숫자를 만들어서 마치 '무작위의 수'처럼 보이게 하는 것입니다.
실행화면
같은 프로그램을 여러번 실행시켰지만 각기다른 난수가 나오고 있습니다.
![]() |
![]() |
![]() |
![]() |
코드해석
//전처리
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(void){
int length,i;
printf("Input Length: "); scanf("%d", &length);
//난수를 위한 난수테이블 초기화 입니다. 이 코드에서는 stdlib의 난수 알고리즘을 사용하였습니다.
srand((unsigned int)time(NULL));
//랜덤문자를 참조할 문자열입니다. 만약 특수기호를 추가하고 싶다면 여기에 넣으면 됩니다.
const char charset[]="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
//총 랜덤 문자열 입니다. 여기에 랜덤한 문자의 나열이 담기는 것이지요.
char randomString[length+1];
//난수를 방금만든 참조문자열에 매칭시켜서 해당 위치의 문자를 순서에 맞게 randomString에 담습니다.
for (i=0;i<length;i++) randomString[i]=charset[rand()%(sizeof(charset)-1)];
randomString[length]='\0';
printf("%s\n", randomString);
while (getchar()!='\n');
printf("\nPRESS ENTER TO EXIT...\n");
getchar();
return 0;
}
2026-07-17 패치
강화버전을 만들었습니다. 사실 여기서 위의 코드를 쓰기엔 보안이 살짝 떨어져보여서 출력가능한 문자 가짓수를 증가하였습니다.

'Satellite' 카테고리의 다른 글
| 8비트 LED버스 제작하기 (0) | 2026.07.13 |
|---|---|
| ESP-NOW 간략하게 다뤄보기 (1) | 2026.07.09 |
| ESP32-C3-OLED 워밍업 (0) | 2026.06.30 |
| 10진수 16진수 자동변환 계산기 (0) | 2026.05.15 |




