본문 바로가기
C#

C#에서 float 형 random 이 없는 이유와 그래도 필요하다면?

by Oz Driver 2025. 11. 16.

C#으로 게임이나 시뮬레이션 코드를 작성하다 보면, 종종 이런 고민을 하게 됩니다.
“int 랜덤은 있는데, 왜 float 랜덤은 없지?”
Random.Next()처럼 간단하게 쓸 수 있는 NextFloat() 같은 함수가 있으면 좋을 것 같은데, C# 기본 Random 클래스에는 그런 함수가 존재하지 않습니다.
이 글에서는 그 이유와, 실제로는 float 랜덤을 어떻게 만들어 써야 하는지 정리해 보겠습니다.

 

1. float 랜덤이 없는 이유

C#의 Random 클래스는 .NET 초창기부터 설계된 타입입니다. 이때 “실수 난수”를 표현하는 기본 타입으로 double이 선택되었습니다. 그래서 지금도 실수 난수는 무조건 NextDouble() 하나만 제공합니다.

정수 계열

 • int Next()

 • int Next(int minValue, int maxValue)

실수 계열

 • double NextDouble()

 

여기서 중요한 점은, 실수(Random) 쪽에는 오직 double만 있다는 것입니다.

왜 float는 없을까요?

double이 float보다 훨씬 정밀하기 때문에 굳이 필요하지 않기 때문입니다. 

 

 • float : 32비트, 대략 7자리 정도의 유효 자릿수

 • double : 64비트, 대략 15~16자리 정도의 유효 자릿수

 

실수 계산에서 double이 기본값으로 쓰이면, 오차 누적에 훨씬 강합니다. 그래서 “실수 난수는 double만 제공하고, 필요한 사람은 알아서 float으로 바꿔 써라”라는 식으로 설계된 것입니다.

 

2. float 랜덤을 사용해야 한다면 ?

float 랜덤이 필요하면, 사실 NextDouble() 결과를 float으로 캐스팅하는 한 줄이면 끝입니다.

float value = (float)rnd.NextDouble();

 

이 정도로 쉽게 만들 수 있기 때문에, 굳이 Random.NextFloat() 같은 별도 API를 늘릴 필요가 없었습니다

.NET이 처음 나왔을 당시, 실수 계산의 기본 타입은 double이었고, 대부분의 수학/과학/그래픽 코드가 double 기준으로 설계되었습니다. 그 흐름이 그대로 이어진 결과라고 볼 수 있습니다.

Random.NextDouble() 의 범위

float 랜덤을 만들기 전에, 먼저 NextDouble()이 어떤 값을 돌려주는지 정확히 알고 있어야 합니다.

Random rnd = new Random();
double value = rnd.NextDouble();
// value 범위: 0.0 <= value < 1.0

 

즉, NextDouble()은 항상 0.0 이상, 1.0 미만의 값을 반환합니다.
이 구간 안에서 난수가 나오기 때문에, 우리가 원하는 float 범위를 만들려면 이 값을 적절히 스케일링해서 사용하면 됩니다.

0.0f ~ 1.0f 범위의 float 난수 만들기

가장 간단한 경우는 NextDouble()을 그대로 float으로 변환하는 방식입니다.

Random rnd = new Random();

float value = (float)rnd.NextDouble();
// value 범위: 0.0f <= value < 1.0f

 

이 한 줄이 사실상 “C#에서의 기본 float 랜덤”이라고 보면 됩니다.

임의의 범위(min ~ max)에서 float 난수 만들기

조금 더 실용적인 상황은, 예를 들어 1.5f ~ 3.0f 사이의 난수가 필요할 때입니다. 이 때는 NextDouble() 결과를 다음과 같은 수식으로 변환해서 사용합니다.

float value = (float)(rnd.NextDouble() * (max - min) + min);

 

예시 코드로 보면 더 직관적입니다.

Random rnd = new Random();

float min = 1.5f;
float max = 3.0f;

float value = (float)(rnd.NextDouble() * (max - min) + min);
// value 범위: 1.5f <= value < 3.0f

 

이 패턴은 거의 모든 언어에서 공통적으로 사용하는 “실수 범위 난수” 공식입니다.

자주 쓰는 유틸 함수 만들기

같은 코드를 매번 쓰기 귀찮다면, 아예 float용 랜덤 함수를 하나 만들어 두는 것도 좋습니다.

float NextFloat(Random rnd)
{
    return (float)rnd.NextDouble();
}

float NextFloat(Random rnd, float min, float max)
{
    return (float)(rnd.NextDouble() * (max - min) + min);
}

 

사용 예시는 다음과 같습니다.

Random rnd = new Random();

float a = NextFloat(rnd);              // 0.0f ~ 1.0f
float b = NextFloat(rnd, -5.0f, 5.0f); // -5.0f ~ 5.0f
float c = NextFloat(rnd, 1.5f, 3.2f);  // 1.5f ~ 3.2f

 

이 정도 유틸 함수만 만들어 두면, 사실상 Random.NextFloat()가 있는 것처럼 편하게 쓸 수 있습니다.

 

3. 정리

C# Random 클래스에는 float 전용 난수 함수가 없습니다.

실수 난수는 NextDouble() 하나로 제공되며, double은 float보다 정밀도가 높기 때문에 기본 타입으로 선택되었습니다.

 

 • NextDouble()의 반환 범위는 0.0 이상 1.0 미만입니다.

 •  float 난수가 필요할 때는 NextDouble() 결과를 (float)로 캐스팅해 사용하면 됩니다.

 •  자주 쓴다면 NextFloat() 같은 유틸 함수를 직접 만들어 두는 것이 가장 편합니다.

 

실제로 게임 로직이나 간단한 시뮬레이션에서는 float 정밀도면 충분한 경우가 많습니다.
그럴 때는 위와 같은 방식으로 NextDouble()을 float으로 변환해 사용하면, 별도의 Random.NextFloat() 가 없어도 전혀 불편함 없이 개발을 진행할 수 있습니다.