어느 언어나 기본적으로 필요한 라이브러리
클래스가 있는데 Random 클래스는
항상 들어가는 클래스입니다.
컴퓨터 소프트웨어에서 생성하는 임의의
난수는 완벽해보이는데, 사실은 진짜 난수가
아니라고 해서 pseudo-random (유사 난수,
짭 난수, 가짜 난수) 라고 합니다.
말이 좀 그러니까 그냥 수도 랜덤이라고
말해도 될 듯 합니다.
알고리즘에 의해서 수학의 통계적으로
안정되도록 생성되는 것이지 컴퓨터안에서
진짜로 임의의 수를 발생시키는 것은 쉽지 않습니다.
여튼 응용 프로그래머는 좋은 품질의
난수 생성기를 사용할 줄 알면 충분합니다.
C#의 기본 클래스가 제공되어 있으니
Random 클래스를 한번 알아보겠습니다.
언제나 그렇듯이 MSDN을 참고합니다.
var rand = new Random();
Random 클래스는 인스턴스를
만들어서 사용합니다. 프로그램에서 많이
사용할 거면 static 인스턴스를
만들어서 사용해도 됩니다.
0부터 9까지의 정수를 하나 만들어 봅니다.
var rand = new Random();
Console.WriteLine(rand.Next(10));
실행결과는 0~9
배열과 리스트에 랜덤 넘버를 채워보겠습니다.
using System;
using System.Collections.Generic;
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
var rand = new Random();
//byte 채우기 0~255
var bytes = new byte[5];
rand.NextBytes(bytes);
Console.WriteLine("[byte array 채우기]");
foreach (var item in bytes)
{
Console.Write($"{item}, ");
}
Console.WriteLine("\n[int 리스트 채우기]");
//int List 0부터 100까지
var intList = new List<int>();
for (int i = 0; i < 5; i++)
{
intList.Add(rand.Next(101));
}
for (int i = 0; i < intList.Count; i++)
{
Console.Write($"{intList[i]}, ");
}
}
}
}
[실행결과] - 매번 다르게 나온다
[byte array 채우기]
142, 143, 3, 64, 189,
[int 리스트 채우기]
20, 87, 12, 23, 56,
NextBytes 는 바이트 배열 전체를
채워주는 편리한 녀석입니다.
범위가 0~255에 주의합니다.
Next 메소드는... 인자 없이 사용하면
양수 int 값을 리턴합니다.
Next(10)는 0~9까지 리턴합니다.
항상 -1을 뺀 범위의 값이
나오는 것에 주의합니다.
*범위를 지정해서 정수를 생성합니다.
Next(10, 51) -> 10부터 50까지의 정수를 생성합니다.
using System;
namespace ConsoleApp1
{
class Program
{
static Random stRand = new Random();
static void Main(string[] args)
{
// 범위 지정한 난수생성 10~50까지
for (int i = 0; i < 5; i++)
{
//Random stRand = new Random();
Console.Write("[{0, 2}]", stRand.Next(10, 51));
}
}
}
}
로또는 1~45까지 숫자를
중복없이 6개를 선택합니다.
for문과 do while 문을 사용하면
중복없이 랜덤한 숫자를 생성할 수 있습니다.
Collection 프레임워크의 List 컨테이너를
사용하면 중복 검색을 위한
함수를 만들 필요가 없습니다.
using System;
using System.Collections.Generic;
namespace ConsoleApp1
{
class Program
{
static Random stRand = new Random();
static void Main(string[] args)
{
var randArr = new List<int>();
int randVar = 0;
bool check;
for (int i = 0; i < 6; i++)
{
do
{
randVar = stRand.Next(45)+1;
check = randArr.Contains(randVar);
//Console.WriteLine(check + " : " + randVar);
} while (check);
randArr.Add(randVar);
}
Console.WriteLine("[로또 번호 생성하기]");
foreach (var item in randArr)
{
Console.Write($"[{item, 2}]");
}
}
}
}
[실행결과] - 난수 생성
[로또 번호 생성하기]
[30][21][13][18][41][38]
이밖에 double 형 난수를 생성하는
NextDouble, 64비트 정수 NextInt64
상속 후 오버라이드 해서 사용하는
Sample 가 있습니다.
상세 사항은 MSDN 을 참고 합니다.
Random 클래스에 대해서 알아봤습니다.
사용법도 어렵지 않고 유용한 클래스입니다.
난수가 필요할 때 사용하도록 합니다.