ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • C# 높은 수준의 랜덤 숫자 (Good Random Number)
    C# 2017. 3. 23. 13:00

    아마 임의의 숫자를 사용하실 때에 Random 클래스를 통해 Next를 사용하여 얻으실 것입니다.


    하지만 이는 seed값이 계속 동일하다면 결국 나중에는 같은 패턴의 숫자들이 나오게 됩니다.


    보통 seed값을 매우 큰 값을 주어서 일반적인 상황에서는 다시 나오게 되기 힘들지만,

    계속해서 많이 돌린다면 같은 패턴이 나오게 될 수 있지요.


    아니면 그냥 Random보다 더 좋은게 없을까 하시는 분이 계실 수 있습니다.



    C#에서는 이를 지원해줍니다. System.Security.Cryptography 네임스페이스에 있습니다.

    이는 보안을 위한 네임스페이스인데, 여기서 높은 수준의 랜덤 넘버를 만들어 줍니다.


    우선 만들어 본 Random 함수입니다.


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    /// <summary>
    /// 임의의 숫자를 반환합니다.
    /// </summary>
    /// <param name="min">하한입니다. (포함)</param>
    /// <param name="max">상한입니다. (제외)</param>
    /// <returns>임의의 숫자</returns>
    private static int Random(int min, int max)
    {
        if (max < min)
            throw new ArgumentOutOfRangeException();
     
        var rand = System.Security.Cryptography.RandomNumberGenerator.Create();
     
        byte[] data = new byte[4];
     
        // 임의의 숫자 생성
        rand.GetBytes(data);
     
        return Math.Abs(BitConverter.ToInt32(data, 0)) % (max - min) + min;
    }
    cs



    (RC4라는 암호화 알고리즘을 사용하여 직접 구현하려 했으나 제공해주기에 그냥 사용합니다.)


    그냥 main함수에서 사용해보는 코드입니다.


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    namespace RandomNumber
    {
        class Program
        {
            static void Main(string[] args)
            {
                byte[] data = new byte[100];
     
                var rand = System.Security.Cryptography.RandomNumberGenerator.Create();
     
                rand.GetBytes(data);
     
                int[] arr = new int[data.Length / 4];
     
                for (int i = 0; i < arr.Length / 4; i++)
                {
                    arr[i] = Math.Abs(BitConverter.ToInt32(data, i * 4));
                }
            }
        }
    }
    cs


    사용법


    (저는 using을 하지 않아서 총 경로를 써주었습니다.)

    System.Security.Cryptography.RandomNumberGenerator 라는 클래스 입니다.


    직접 생성자를 통한 생성은 불가능합니다. Create()라는 함수를 통해 인스턴스를 줍니다.


    굳이 var이 아닌 클래스명을 사용하셔도 됩니다. (RandomNumberGenerator)


    GetBytes() 함수는 전달받은 byte 배열에 임의의 정수를 생성하여 넣어줍니다. 이 byte를 사용하시면 됩니다. 



    저는 int형이 필요하여 4byte단위로 끊어서 Convert 해주었습니다. 그리고 음수값이 들어가는게 싫어서 Abs로 절댓값만 받았구요.


    굳이 4byte 단위로 끊지 않고 int형으로 변환하셔도 되며, byte 배열을 마음대로 사용하시면 됩니다.



    댓글

GiGong