[c#] 난수 int 숫자를 어떻게 생성합니까?

C #에서 임의의 정수를 어떻게 생성합니까?



답변

Random클래스 는 난수를 만드는 데 사용됩니다. (물론 의사 난수입니다.).

예:

Random rnd = new Random();
int month  = rnd.Next(1, 13);  // creates a number between 1 and 12
int dice   = rnd.Next(1, 7);   // creates a number between 1 and 6
int card   = rnd.Next(52);     // creates a number between 0 and 51

둘 이상의 임의의 숫자를 작성하려는 경우 Random인스턴스를 유지 하고 재사용해야합니다. 새 인스턴스를 제 시간에 너무 가깝게 만들면 시스템 시계에서 임의 생성기가 시드 될 때와 동일한 일련의 임의의 숫자가 생성됩니다.


답변

질문은 매우 단순 해 보이지만 대답은 약간 복잡합니다. 거의 모든 사람들이 Random 클래스를 사용하도록 제안했으며 일부는 RNG 암호화 클래스를 사용하도록 제안했습니다. 그러나 언제 무엇을 선택할 지.

이를 위해서는 먼저 RANDOMNESS라는 용어와 그 뒤에있는 철학을 이해해야합니다.

C # https://www.youtube.com/watch?v=tCYxc-2-3fY를 사용하여 RANDOMNESS의 철학에 깊이 들어가는이 비디오를 시청 하시기 바랍니다.

우선 RANDOMNESS의 철학을 이해하겠습니다. 우리가 사람에게 RED, GREEN, YELLOW 중에서 내부에서 일어나는 일을 선택하라고 말할 때. 사람이 빨간색, 노란색 또는 녹색을 선택하게하는 이유는 무엇입니까?

C # 랜덤

일부 초기 생각은 사람의 마음에 들어가 그의 선택을 결정합니다. 좋아하는 색, 행운의 색 등이 될 수 있습니다. 다시 말해 RANDOM에서 SEED라고하는 초기 트리거입니다.이 SEED는 시작점이며, RANDOM 값을 선택하도록하는 트리거입니다.

이제 SEED가 추측하기 쉬운 경우 이러한 종류의 난수를 PSEUDO 라고 하며 시드를 추측하기 어려운 경우 해당 난수를 SECURED 난수 라고 합니다.

예를 들어 날씨와 소리의 조합에 따라 색상을 선택하면 초기 씨앗을 추측하기가 어렵습니다.

C # 랜덤

이제 중요한 진술을하겠습니다 :-

*“랜덤”클래스는 PSEUDO 난수 만 생성하며 SECURE 난수를 생성하려면“RNGCryptoServiceProvider”클래스를 사용해야합니다.

C # 랜덤

랜덤 클래스는 CPU 클럭에서 시드 값을 가져와 매우 예측 가능합니다. 즉, C #의 RANDOM 클래스는 의사 난수를 생성합니다. 아래는 동일한 코드입니다.

** 참고 : ** .NET Core 2.0.0+는 매개 변수없는 생성자에서 다른 시드를 사용합니다 Guid.NewGuid().GetHashCode(). CPU 클럭 대신을 사용합니다 .

var random = new Random();
int randomnumber = random.Next()

그동안 RNGCryptoServiceProvider클래스가 사용하는 OS는 씨앗을 생성하기 위해 엔트로피. OS 엔트로피는 소리, 마우스 클릭 및 키보드 타이밍, 열 온도 등을 사용하여 생성되는 임의의 값입니다. 아래는 동일한 코드입니다.

using (RNGCryptoServiceProvider rg = new RNGCryptoServiceProvider()) 
{ 
    byte[] rno = new byte[5];    
    rg.GetBytes(rno);    
    int randomvalue = BitConverter.ToInt32(rno, 0); 
}

OS 엔트로피를 이해하려면 14:30 https://www.youtube.com/watch?v=tCYxc-2-3fY 에서이 비디오를 참조하십시오. 여기서 OS 엔트로피의 논리가 설명됩니다. 따라서 간단한 단어로 RNG Crypto를 사용하면 안전한 임의의 숫자가 생성됩니다.


답변

새로운 Random () 할 때마다 초기화됩니다. 이것은 타이트한 루프에서 동일한 값을 여러 번 얻는다는 것을 의미합니다. 단일 임의 인스턴스를 유지하고 동일한 인스턴스에서 다음을 계속 사용해야합니다.

//Function to get random number
private static readonly Random getrandom = new Random();

public static int GetRandomNumber(int min, int max)
{
    lock(getrandom) // synchronize
    {
        return getrandom.Next(min, max);
    }
}


답변

new Random()현재 타임 스탬프에 시드 된 것을주의하십시오 .

하나의 숫자 만 생성 하려면 다음을 사용할 수 있습니다.

new Random().Next( int.MinValue, int.MaxValue )

자세한 내용은 Random 클래스를 참조하십시오.

그러나 클럭의 해상도는 유한하기 때문에 매개 변수가없는 생성자를 사용하여 연속적으로 다른 임의의 객체를 생성하면 동일한 난수 시퀀스를 생성하는 난수 생성기가 생성됩니다.

따라서이 코드를 사용하여 일련의 난수를 생성하지 마십시오.


답변

Random r = new Random();
int n = r.Next();


답변

암호로 안전한 버전을 추가하고 싶었습니다.

RNGCryptoServiceProvider 클래스 ( MSDN 또는 dotnetperls )

IDisposable을 구현합니다.

using (RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider())
{
   byte[] randomNumber = new byte[4];//4 for int32
   rng.GetBytes(randomNumber);
   int value = BitConverter.ToInt32(randomNumber, 0);
}


답변

Jon Skeet의 StaticRandom 메소드를 의사 난수로 작성한 MiscUtil 클래스 라이브러리에서 사용할 수 있습니다.

using MiscUtil;
...

for (int i = 0; i < 100;
    Console.WriteLine(StaticRandom.Next());