게임/고도엔진 문법

23. [고도 엔진] 예측 불가능한 재미: 난수 생성기(randi, randf) 활용법

밀감감 2026. 7. 11. 13:00
반응형

 

이 카테고리는 고도 엔진(Godot Engine) 관련 문법을 기록하고 저장하기 위해 만든 공간입니다.

 

이번에는 RPG 게임에서 검을 휘두를 때마다 데미지가 10~15 사이로 다르게 들어가고, 몬스터를 잡았을 때 30% 확률로 희귀한 아이템이 떨어지는 것을 본 적이 있으실 겁니다. 게임에 '예측 불가능한 재미(무작위성)'를 불어넣는 핵심 기술이 바로 난수(Random Number)입니다. 고도 엔진에서 가장 자주 쓰이는 난수 생성 함수들을 알아보겠습니다.

1. randi_range(): 주사위 굴리기 (정수 난수)

randi는 Random Integer(무작위 정수)의 줄임말입니다. 기본 randi() 함수는 0부터 엄청나게 큰 숫자(약 42억) 사이의 무작위 숫자를 뱉어내기 때문에 그대로 쓰기에는 조금 불편합니다. 그래서 실전에서는 최소값과 최대값을 직접 지정할 수 있는 randi_range()를 훨씬 더 많이 사용합니다.

 

GDScript

 
func attack():
    # 1. 10부터 15 사이의 '정수(10, 11, 12, 13, 14, 15)' 중 하나를 무작위로 뽑습니다.
    var damage = randi_range(10, 15)
    print("몬스터에게 ", damage, "의 데미지를 입혔습니다!")

    # 2. 1부터 6까지, 6면체 주사위를 굴립니다.
    var dice_roll = randi_range(1, 6)

2. randf_range()와 randf(): 디테일한 조정과 확률 (실수 난수)

randf는 Random Float(무작위 실수/소수점)의 줄임말입니다. 정수와 달리 소수점 아래까지 쪼개지는 숫자가 필요할 때 사용합니다. 타이머의 대기 시간을 무작위로 설정하거나, 화면 내의 무작위 X 좌표에 몬스터를 소환할 때 유용합니다.

특히 괄호 안이 비어있는 기본 randf()는 0.0에서 1.0 사이의 실수를 반환하는데, 이를 활용하면 게임에서 'n% 확률로 성공' 같은 시스템을 아주 쉽게 만들 수 있습니다.

GDScript
 
func spawn_monster():
    # 1. 화면의 X좌표 100.0 ~ 800.0 사이의 임의의 위치(소수점 포함)를 뽑습니다.
    var random_x = randf_range(100.0, 800.0)
    position.x = random_x
    
func open_chest():
    # 2. 30% 확률로 희귀 아이템 드랍하기
    # randf()는 0.0 ~ 1.0을 반환하므로, 0.3 이하일 확률은 정확히 30%가 됩니다.
    if randf() <= 0.3:
        print("축하합니다! 전설의 검을 획득했습니다!")
    else:
        print("평범한 돌멩이가 나왔습니다.")

3. pick_random(): 배열에서 아무거나 하나 뽑기 (보너스 팁)

고도 엔진의 배열(Array)에는 아주 강력하고 편리한 내장 함수인 pick_random()이 있습니다. 아이템 목록이나 적들의 이름 목록을 배열로 만들어두고, 그중 하나를 무작위로 추첨하고 싶을 때 복잡한 계산 없이 단 한 줄로 해결할 수 있습니다.

GDScript
 
var loot_table = ["포션", "골드", "화살", "폭탄"]

func get_random_loot():
    # 배열에 들어있는 4개의 아이템 중 하나를 무작위로 선택해서 반환합니다.
    var dropped_item = loot_table.pick_random()
    print(dropped_item, "을(를) 주웠습니다!")

한눈에 보는 난수 생성 핵심 요약

함수 / 기능 기능 설명 실전 디버깅 활용 예시
randi_range(min, max) min과 max 사이의 무작위 정수를 반환합니다. (min, max 포함) 무기 데미지 계산 (10~15), 주사위 굴리기, 획득 골드량 결정
randf_range(min, max) min과 max 사이의 무작위 **실수(소수점)**를 반환합니다. 몬스터 스폰 위치(좌표) 결정, 1.5초~3.0초 사이의 랜덤한 공격 딜레이
randf() 0.0부터 1.0 사이의 무작위 실수를 반환합니다. 0.1(10%), 0.5(50%) 등 확률 시스템을 구현할 때 (if randf() <= 확률:)
배열.pick_random() 배열(Array) 안에 들어있는 데이터 중 하나를 무작위로 뽑습니다. 보물상자에서 여러 종류의 아이템 중 하나를 무작위로 떨어뜨릴 때
randi() 0부터 약 42억 사이의 무작위 정수를 반환합니다. (범위가 너무 넓어 게임 플레이 로직보다는 암호화나 난수 시드 등에 주로 쓰임)

 

반응형