C#의 난수 생성기

WBOY
풀어 주다: 2024-09-03 15:34:50
원래의
642명이 탐색했습니다.

난수 생성기는 정수와 부동 소수점 숫자를 무작위로 생성하는 C#에 내장된 라이브러리입니다. 라이브러리의 관련 메서드가 호출될 때마다 난수를 반환합니다. 일련의 난수는 어떤 패턴도 따르지 않는 숫자의 집합입니다. C#의 난수 생성기는 호출될 때마다 이러한 계열을 생성하는 경향이 있습니다.

C#의 임의 클래스

  • 그렇다면 C#에서는 일련의 난수를 어떻게 생성합니까? 그 답은 C# 시스템 네임스페이스의 Random Class에 있습니다.
  • Random 클래스는 의사 난수 생성기 클래스입니다. 이는 이 클래스가 어떤 패턴도 따르지 않는 일련의 숫자를 생성하는 임무를 맡고 있음을 의미합니다. 그런데 기계가 정말 난수를 생성할 수 있을까요? 기계는 다음에 어떤 숫자를 생성할지 어떻게 알 수 있을까요? 결국 기계는 지시를 따르고 알고리즘을 실행하도록 설계되었습니다.
  • 아니요, 기계는 스스로 난수를 생성할 수 없습니다. 현재 시계와 기계 상태를 기반으로 집합에서 숫자를 선택하도록 안내하는 정의된 수학적 알고리즘이 있습니다. 세트에 있는 모든 숫자는 선택될 확률이 동일합니다. 따라서 완벽하게 무작위가 아닙니다. 그들은 패턴을 따릅니다. 단지 패턴이 인간의 실제 요구 사항을 충족할 만큼 충분히 무작위적이라는 것뿐입니다.

유사 및 보안

다음으로 떠오르는 질문은 왜 의사 난수 생성기 클래스라고 부르는가입니다. 실제 인간 행동을 통해 이를 이해해 보겠습니다. 인간에게 임의의 색상을 선택하라는 요청을 받으면 특정 색상을 선택합니다. 그가 노란색을 선택했다고 가정 해 보겠습니다. 그가 노란색을 선택한 이유는 무엇입니까? 그가 가장 좋아하는 색일 수도 있고, 주변의 색일 수도 있고, 그 당시 노란색을 생각하고 있었을 수도 있다. 무작위로 무언가를 선택하는 결정을 내리는 이러한 인간 행동을 무작위성의 세계에서는 씨앗이라고 합니다. 시드는 무작위성의 방아쇠이자 시작점입니다.

이제 시드를 예측할 수 있게 되면 난수는 덜 무작위가 됩니다. 그런 다음 이를 의사 난수라고 합니다. 예측할 수 없는 경우 보안 난수라고 합니다.

C# Random Class는 현재 타임스탬프를 시드로 사용하는데, 이는 매우 예측 가능합니다. 따라서 의사 난수 생성기 클래스라는 용어가 사용되었습니다.

RNGCryptoServiceProvider 클래스

System.Security.Cryptography 네임스페이스의 RNGCryptoServiceProvider 클래스는 비밀번호로 사용할 수 있는 보안 난수를 생성할 수 있습니다.

C#의 난수 생성기 함수

C#에서 난수를 생성하는 첫 번째 작업은 Random 클래스를 초기화하는 것입니다. 이는 클래스의 두 생성자 중 하나를 사용하여 수행할 수 있습니다.

  • Random(): 시간 기반 시드 값을 사용하여 Random 클래스의 객체를 초기화합니다. 시드 값은 머신의 현재 타임스탬프입니다. 하지만 이후 버전에서는 GUID 기반으로 변경되었습니다.
  • Random(Int32): 지정된 시드 값을 사용하여 Random 클래스의 개체를 초기화합니다. 계열에서 다음 난수를 얻으려면 Random 클래스의 Next() 메서드를 호출합니다.
  • Next(): 음수가 아닌 의사 난수 Int32 정수를 반환합니다.
  • Next(Int32): 지정된 정수보다 작은 음수가 아닌 의사 난수 Int32 정수를 반환합니다.
  • Next(Int32, Int32): 지정된 범위 내에서 음수가 아닌 의사 난수 Int32 정수를 반환합니다.

C#의 난수 생성기 정수

임의의 정수를 생성하는 방법의 예를 살펴보겠습니다.

예시 #1

아래 예에서는 임의의 Int32 숫자를 생성합니다.

코드:

using System;
public class Program
{
public static void Main()
{
Random rnd = new Random();
for (int i = 0; i < 10; i++)
Console.WriteLine("Random number {0} : {1}", i + 1, GenerateRandomInt(rnd));
}
public static int GenerateRandomInt(Random rnd)
{
return rnd.Next();
}
}
로그인 후 복사

출력:

C#의 난수 생성기

예시 #2

아래 예에서는 0~100 범위의 임의의 Int32 숫자를 생성합니다.

코드:

using System;
public class Program
{
public static void Main()
{
Random rnd = new Random();
for (int i = 0; i < 10; i++)
Console.WriteLine("Random number {0} : {1}", i + 1, GenerateRandomInt(rnd));
}
public static int GenerateRandomInt(Random rnd)
{
return rnd.Next(100);
}
}
로그인 후 복사

출력:

C#의 난수 생성기

예시 #3

아래 예에서는 50~100 범위의 임의의 Int32 숫자를 생성합니다.

코드:

using System;
public class Program
{
public static void Main()
{
Random rnd = new Random();
for (int i = 0; i < 10; i++)
Console.WriteLine("Random number {0} : {1}", i + 1, GenerateRandomInt(rnd));
}
public static int GenerateRandomInt(Random rnd)
{
return rnd.Next(50, 100);
}
}
로그인 후 복사

출력:

C#의 난수 생성기

C#에서 부동 소수점 숫자 생성

난수 부동 소수점 숫자를 생성하는 방법의 예를 살펴보겠습니다.

예시 #1

아래 예에서는 임의의 Int32 숫자를 생성합니다.

코드:

using System;
public class Program
{
public static void Main()
{
Random rnd = new Random();
for (int i = 0; i < 10; i++)
Console.WriteLine("Random number {0} : {1}", i + 1, GenerateRandomInt(rnd));
}
public static double GenerateRandomInt(Random rnd)
{
return rnd.NextDouble();
}
}
로그인 후 복사

출력:

C#의 난수 생성기

A Very Common Mistake

The most common mistake developers commit while generating random numbers is that for each random number, they create a new object of Random Class. As illustrated in the example below:

Example #1

Code:

using System;
public class Program
{
public static void Main()
{
for (int i = 0; i < 10; i++)
Console.WriteLine("Random number {0} : {1}", i + 1, GenerateRandomInt());
}
public static int GenerateRandomInt()
{
Random rnd = new Random();  //a very common mistake
return rnd.Next();
}
}
로그인 후 복사

Output:

C#의 난수 생성기

How Random Numbers are all the same and Why did this happen?

As explained in the working of Random Class, the numbers generated are based on the seed value and the current state of the machine. Any instance of Random class starts with the seed value, saves the current state and uses it to generate the next random number. In the code above, the mistake was to create a new instance of the Random class in every iteration of the loop. So, before the time in the internal clock changes, the code is fully executed, and each instance of Random class is instantiated with the same seed value. This results in the same set of numbers generated every time.

Conclusion

In this article, we learnt about the random number generator in C# and how it internally works to generate random numbers. We also briefly learnt the concept of pseudo-random and secure-random numbers. This information is sufficient for developers to use the Random class in their applications. Deep dive, if interested to explore more on random numbers for passwords and one-time passwords.

위 내용은 C#의 난수 생성기의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!