자바스크립트를 허용해주세요.
[ 자바스크립트 활성화 방법 ]
from Mohon Aktifkan Javascript!
 

[알고리즘] 난수란?

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