Random 클래스란?System.Random은 .NET에서 랜덤 숫자를 생성하기 위한 클래스다.
숫자를 생성하는 알고리즘은 의사난수(pseudorandom number)를 기반으로 한다. 정해진 알고리즘에 따라 생성되어 진짜 랜덤은 아니지만 랜덤처럼 보이게 된다.
Random rand = new Random();으로 Random 클래스의 새 인스턴스를 생성한다. 생성자 호출 시, 내부적으로 시간 기반의 기본 시드(seed)를 사용하여 난수 생성기를 초기화한다.
rand 객체를 사용해 다양한 난수를 생성할 수 있다.
정수 난수 생성 (Next)
rand.Next(): 0 이상 Int32.MaxValue 미만의 정수를 반환.rand.Next(maxValue): 0 이상 maxValue 미만의 정수를 반환.rand.Next(minValue, maxValue): minValue 이상 maxValue 미만의 정수를 반환.int randomNumber = rand.Next(); // 임의의 정수
int randomBetween0And9 = rand.Next(10); // 0부터 9 사이
int randomBetween10And20 = rand.Next(10, 21); // 10부터 20 사이
실수 난수 생성 (NextDouble)
rand.NextDouble(): 0.0 이상 1.0 미만의 부동소수점(double)을 반환.double randomDouble = rand.NextDouble(); // 0.0 <= x < 1.0
랜덤 값을 원하는 범위로 변환
double randomInRange = rand.NextDouble() * (maxValue - minValue) + minValue;
Random 인스턴스를 반복 생성하면 문제 발생 가능
new Random()이 호출될 때 기본적으로 현재 시간을 기준으로 시드를 설정하므로, 짧은 시간 동안 여러 개의 Random 객체를 생성하면 같은 시드 값을 갖게 되어 동일한 난수 값이 반복될 수 있다. 이 때, 프로그램에서 하나의 Random 객체를 공유하거나 ThreadLocalRandom을 사용하는 것이 좋다.
멀티스레드 환경에서 주의
Random은 멀티스레드 환경에서 안전하지 않다. 스레드마다 별도의 난수 생성기를 사용하거나 System.Security.Cryptography.RandomNumberGenerator를 사용하는 것이 좋다.
using System;
class Program
{
static void Main()
{
Random rand = new Random();
// 정수 난수
Console.WriteLine(rand.Next()); // 0 이상 임의의 정수
Console.WriteLine(rand.Next(10)); // 0 이상 10 미만
Console.WriteLine(rand.Next(10, 20)); // 10 이상 20 미만
// 실수 난수
Console.WriteLine(rand.NextDouble()); // 0.0 이상 1.0 미만
// 범위를 지정한 실수 난수
double randomInRange = rand.NextDouble() * (100 - 50) + 50; // 50.0 이상 100.0 미만
Console.WriteLine(randomInRange);
}
}