C# Random 클래스

어느 언어나 기본적으로 필요한 라이브러리

클래스가 있는데 Random 클래스는

항상 들어가는 클래스입니다.

 

컴퓨터 소프트웨어에서 생성하는 임의의

난수는 완벽해보이는데, 사실은 진짜 난수가

아니라고 해서 pseudo-random (유사 난수,

짭 난수, 가짜 난수) 라고 합니다.

말이 좀 그러니까 그냥 수도 랜덤이라고

말해도 될 듯 합니다.

알고리즘에 의해서 수학의 통계적으로

안정되도록 생성되는 것이지 컴퓨터안에서

진짜로 임의의 수를 발생시키는 것은 쉽지 않습니다.

 

여튼 응용 프로그래머는 좋은 품질의

난수 생성기를 사용할 줄 알면 충분합니다.

C#의 기본 클래스가 제공되어 있으니

Random 클래스를 한번 알아보겠습니다.

 

언제나 그렇듯이 MSDN을 참고합니다.

 

 

Random Class (System)

Represents a pseudo-random number generator, which is an algorithm that produces a sequence of numbers that meet certain statistical requirements for randomness.

docs.microsoft.com

 

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을 뺀 범위의 값이

나오는 것에 주의합니다.

 

 

Random.Next Method (System)

Returns a random integer.

docs.microsoft.com

 

*범위를 지정해서 정수를 생성합니다.

 

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 클래스에 대해서 알아봤습니다.

사용법도 어렵지 않고 유용한 클래스입니다.

난수가 필요할 때 사용하도록 합니다.

공유하기

facebook twitter kakaoTalk kakaostory naver band