728x90

🤓 1. 난수란?
난수(Random Number)란 말 그대로 다음에 나올 수를 예측할 수 없는 규칙이 없는 숫자처럼 보이는 값을 의미합니다, 우리가 컴퓨터애서 흔히 말하는 난수는 엄밀히 따지면 의사난수(Pseudo Random Number, PRNG)입니다. 컴퓨터는 0과 1의 논리적인 연산을 기반으로 하고 있고, 그 과정에서 무작위(Random)를 생성하기 어렵기에 특정 알고리즘(수학적 공식)을 사용해 겉보기엔 무작위 같은 수열을 만들어 내고 있습니다.
- 진짜 난수(True Random Number) ➡️ 자연적인 현상(방사능 붕괴, 열 잡음, 전자 신호 등)에서 추출한 무작위 값
- 의사 난수(Pasudo Random Number) ➡️ 컴퓨터 알고리즘이 만들어내는 값, 예측은 가능해도, 특정 시드(Seed)를 모르면 예측하기가 어려움
🤓 2. 난수 생성의 원리
🚀 1. 시드(Seed)
- 난수를 생성하기 위해 항상 '출발점(시드)' 가 필요함
- 시드안에 같은 시드를 넣으면 같은 난수열이 생성
- 예를 들어, seed(1234)라고 지정하면 매번 같은 결과가 나오기 때문에 재현 가능성이 나오기 때문에 재현 가능성이 생겨 테스트할 때 유용
🚀 2. 알고리즘
- 대표적으로 선형 합동법(Linear Congruential Generator, LCG), Mersenne Twister같은 방법
- 예): LCG 공식
Xn+1 = (a * Xn + c) mod m
여기서 a, c, m은 상수, Xn은 현재 난수 값이됨
🚀 3. 분포
- 단순히 0~1 사이의 균등분포(Uniform Distribution)뿐만 아니라,
- 정규분포(Normal Distribution), 이항분포,푸아송분포 등 다양한 확률 분포에 맞는 난수를 생성 가능
🤓 3. 난수의 종류
- 정수형 난수 -> 특정 범위 안에서 무작위로 선택된 정수(예: 1~100 사이의 랜덤 숫자)
- 실수형 난수 -> 부동소수점(Floating-point) 값을 생성하는 난수 (예: 0.0 ~ 1.0 사이의 값)
- 유사 난수 -> 특정 범위 내의 알고리즘을 따라서 생성되는 난수 (예: 10~50 사이 랜덤 값)
- 확률 분포 기반 난수 -> 정규분포를 따르는 랜덤 값(통계, 머신러닝에 자주 사용)
🤓 4. 언어별 난수 예제
➡️ 1. Python
import random
# 시드 설정 (고정된 결과 재현)
random.seed(42)
# 0 이상 1 미만의 실수
print(random.random())
# 정수 난수 (1 ~ 100)
print(random.randint(1, 100))
# 범위 지정 난수 (0 ~ 10, step=2)
print(random.randrange(0, 11, 2))
# 정규 분포 난수(평균 0, 표준편차 1)
print(random.gauss(0, 1))
➡️ 2. Java
import java.util.Random;
public class Main {
public static void main(String[] args) {
Random rand = new Random(42); // 시드 고정
// 0 이상 1 미만의 실수
System.out.println(rand.nextDouble());
// 0~99 정수
System.out.println(rand.nextInt(100));
// Boolean 값
System.out.println(rand.nextBoolean());
}
}
➡️ 3. JavaScript
// 기본적으로 Math.random을 사용함
// 0 이상 1 미만의 실수
console.log(Math.random());
// 1 ~ 100까지 정수
console.log(Math.floor(Math.random() * 100) + 1);
// 특정 범위(0 ~ 50)
function getRandom(min, max) {
return Math.floor(Math.random() * (max - min + 1) + min);
}
console.log(getRandom(0, 50));
➡️ 4. C#
using System;
class Program {
static void Main() {
Random rand = new Random(42);
// 0 이상 1 미만 실수
Console.WriteLine(rand.NextDouble());
// 1 ~ 100 정수
Console.WriteLine(rand.Next(1, 101));
// 배열에서 무작위 선택
string[] pick = { "짜장면", "짬뽕", "볶음밥" };
Console.WriteLine(pick[rand.Next(pick.Length)]);
}
}
// vscode 용
csc random_3.cs # 컴파일 → random_3.exe 생성
.\random_3.exe # 실행
➡️ 5. Go
package main
import (
"fmt"
"math/rand"
"time"
)
func main() {
fmt.Println(time.Now().UnixNano()); // 현재 시간 기반 시드
// 0 ~ 99 정수
fmt.Println(rand.Intn(100))
// 0.0 ~ 1.0 실수
fmt.Println(rand.Float64())
// 10 ~ 50 사이 정수
fmt.Println(rand.Intn(41) + 10)
}
🤓 5. 난수의 활용 분야
🚀 1. 게임 개발
- 몬스터 등장 위치, 아이템 드랍률, 카드 섞기, 데미지 계산 등
🚀 2. 통계/시뮬레이션
- 몬테카를로 시뮬레이션(Monte Carlo Simulation) -> 확률적 문제를 난수로 해결 가능
- 샘플리(sampling) 작업에도 활용
🚀 3. 보안/암호학
- 암호 키 생성, 토큰 발급, 보안용 난수는 반드시 진짜 난수(TRNG) 또는 암호학적 난수(CSPRNG)를 사용해야함
- 단순한 Math.random() 방식은 보안에 취약함
🚀 4. 머신러닝/데이터분석
- 학습 데이터 분할(train/test split).
- 가중치 초기화
- 무작위 샘플링
✅ 정리
- 난수는 그저 무작위로 보이는 값이라 생각할 수 있으나, 대부분 의사난수(알고리즘 기반)임.
- 난수를 생성 할 시 시드(seed)가 매우 중요하기 때문에, 재현성 있는 테스트 환경에서는 시드를 고정시켜야함
- 언어별 기본 라이브러리에서 난수를 지원하지만, 보안 관련 작업에서는 반드시 CSRPNG(암호학적 난수 생성기)를 사용
- 활용 분야는 게임, 통계, 보안, 머신러닝 등 다양한 환경에서 사용
GitHub - Koras02/random-number
Contribute to Koras02/random-number development by creating an account on GitHub.
github.com
728x90
LIST
'웹' 카테고리의 다른 글
| [웹] CORS, XSS, CSRF이란 무엇인가? (2) | 2025.08.27 |
|---|---|
| [Web] SSR이란? 서버 사이드 렌더링 (0) | 2025.03.01 |
| [Web] 인터넷 프로토콜의 종류 (0) | 2025.02.27 |
| [Web] 상태코드란? (0) | 2025.02.27 |
| [Web] 개발자의 종류에 관해 (0) | 2025.02.23 |