etc./StackOverFlow

임의의 정수를 어떻게 생성합니까?

청렴결백한 만능 재주꾼 2021. 12. 1. 00:00
반응형

질문자 :Rella


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 인스턴스를 유지하고 재사용해야 합니다. 너무 가까운 시간에 새 인스턴스를 생성하면 시스템 시계에서 임의 생성기가 시드된 것과 동일한 일련의 난수가 생성됩니다.


Guffa

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

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

C# https://www.youtube.com/watch?v=tCYxc-2-3fY를 사용하여 RANDOMNESS의 철학에 대해 자세히 설명하는 이 비디오를 시청하는 것이 좋습니다.

먼저 RANDOMNESS의 철학을 이해합시다. 우리가 사람에게 RED, GREEN, YELLOW 중에서 선택하라고 말할 때 내부적으로 일어나는 일. 사람이 RED 또는 YELLOW 또는 GREEN을 선택하게 만드는 이유는 무엇입니까?

C# 랜덤

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

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

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

C# 랜덤

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

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

C# 랜덤

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

 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 엔트로피를 이해하려면 OS 엔트로피의 논리가 설명 된 14:30 https://www.youtube.com/watch?v=tCYxc-2-3fY의 이 비디오를 참조하십시오. 따라서 간단한 단어로 RNG Crypto를 입력하면 SECURE 난수가 생성됩니다.


Shivprasad Koirala

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

 //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); } }

Pankaj Mishra

new Random() 은 현재 타임스탬프에 시드됩니다.

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

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

자세한 내용은 Random 클래스를 참조하세요.

그러나 시계에는 유한한 분해능이 있기 때문에 매개변수가 없는 생성자를 사용하여 서로 다른 Random 객체를 연속적으로 생성하면 동일한 난수 시퀀스를 생성하는 난수 생성기가 생성됩니다.

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


Fyodor Soikin

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

Joren

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

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); }

joordan831

랜덤 객체 생성

 Random rand = new Random();

그리고 그것을 사용

 int randomNumber = rand.Next(min, max);

new Random() 을 초기화할 필요가 없습니다. 하나의 Random을 시작한 다음 루프 내에서 필요한 만큼 여러 번 사용합니다.


Mohamed

의사 난수를 위해 구축한 MiscUtil 클래스 라이브러리 내에서 Jon Skeet의 StaticRandom 메서드를 사용할 수 있습니다.

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

mbcrump

COBOL 답변을 제외한 모든 솔루션을 시도했습니다 ... lol

이러한 솔루션 중 어느 것도 충분하지 않았습니다. 빠른 for int 루프에서 무작위가 필요했고 매우 넓은 범위에서도 수많은 중복 값을 얻었습니다. 임의의 결과에 대해 너무 오랫동안 정착한 후 마침내 이 문제를 한 번에 해결하기로 결정했습니다.

그것은 모두 씨앗에 관한 것입니다.

Guid에서 숫자가 아닌 것을 구문 분석하여 임의의 정수를 만든 다음 이를 사용하여 Random 클래스를 인스턴스화합니다.

 public int GenerateRandom(int min, int max) { var seed = Convert.ToInt32(Regex.Match(Guid.NewGuid().ToString(), @"\d+").Value); return new Random(seed).Next(min, max); }

업데이트 : Random 클래스를 한 번 인스턴스화하면 시딩이 필요하지 않습니다. 따라서 정적 클래스를 만들고 해당 클래스에서 메서드를 호출하는 것이 가장 좋습니다.

 public static class IntUtil { private static Random random; private static void Init() { if (random == null) random = new Random(); } public static int Random(int min, int max) { Init(); return random.Next(min, max); } }

그런 다음 다음과 같이 정적 클래스를 사용할 수 있습니다.

 for(var i = 0; i < 1000; i++) { int randomNumber = IntUtil.Random(1,100); Console.WriteLine(randomNumber); }

나는 이 접근법이 더 좋다는 것을 인정한다.


Proximo

내장된 Random 클래스(System.Random)에 의해 생성된 숫자는 의사 난수를 생성합니다.

RNGCryptoServiceProvider 와 같은 C#의 암호화 클래스를 사용하여 생성할 수 있는 "보안 의사 난수 생성기"입니다.

그럼에도 불구하고 여전히 진정한 난수가 필요한 경우 방사성 붕괴를 설명하는 장치와 같은 외부 소스를 난수 생성기의 시드로 사용해야 합니다. 정의에 따르면 순수한 알고리즘 방식으로 생성된 모든 숫자는 진정으로 무작위일 수 없습니다.


Anshita Arya

여기 에서 수정 된 답변 .

Intel 보안 키 호환 CPU에 액세스할 수 있는 경우 다음 라이브러리를 사용하여 실제 난수 및 문자열을 생성할 수 있습니다. https://github.com/JebteK/RdRandhttps://www.rdrand.com/

여기 에서 최신 버전을 다운로드하고 Jebtek.RdRand를 포함하고 이에 대한 using 문을 추가하세요. 그런 다음 다음과 같이 하면 됩니다.

 // Check to see if this is a compatible CPU bool isAvailable = RdRandom.GeneratorAvailable(); // Generate 10 random characters string key = RdRandom.GenerateKey(10); // Generate 64 random characters, useful for API keys string apiKey = RdRandom.GenerateAPIKey(); // Generate an array of 10 random bytes byte[] b = RdRandom.GenerateBytes(10); // Generate a random unsigned int uint i = RdRandom.GenerateUnsignedInt();

코드를 실행할 호환되는 CPU가 없으면 rdrand.com에서 RESTful 서비스를 사용하십시오. 프로젝트에 포함된 RdRandom 래퍼 라이브러리를 사용하면 다음과 같이 하면 됩니다(가입할 때 1000개의 무료 통화가 제공됨).

 string ret = Randomizer.GenerateKey(<length>, "<key>"); uint ret = Randomizer.GenerateUInt("<key>"); byte[] ret = Randomizer.GenerateBytes(<length>, "<key>");

JebaDaHut

난수를 가지기 위해 아래 코드를 사용했습니다(권장하지 않음).

 var random = new Random((int)DateTime.Now.Ticks); var randomValue = random.Next(startValue, endValue + 1);

shA.t

이것은 괜찮지만:

 Random random = new Random(); int randomNumber = random.Next()

대부분의 경우 제한(최소 및 최대 수)을 제어하고 싶을 것입니다. 따라서 난수가 시작되고 끝나는 위치를 지정해야 합니다.

Next() 메서드는 min 및 max의 두 매개 변수를 허용합니다.

따라서 내 임의의 숫자가 5와 15 사이가 되도록 하려면

 int randomNumber = random.Next(5, 16)

Ojonugwa Jude Ochalifu

제가 사용하는 클래스입니다. RandomNumber.GenerateRandom(1, 666) 처럼 작동합니다.

 internal static class RandomNumber { private static Random r = new Random(); private static object l = new object(); private static Random globalRandom = new Random(); [ThreadStatic] private static Random localRandom; public static int GenerateNewRandom(int min, int max) { return new Random().Next(min, max); } public static int GenerateLockedRandom(int min, int max) { int result; lock (RandomNumber.l) { result = RandomNumber.r.Next(min, max); } return result; } public static int GenerateRandom(int min, int max) { Random random = RandomNumber.localRandom; if (random == null) { int seed; lock (RandomNumber.globalRandom) { seed = RandomNumber.globalRandom.Next(); } random = (RandomNumber.localRandom = new Random(seed)); } return random.Next(min, max); } }

AskethZ

나중에 참고할 수 있도록 참고하세요.

.NET Core를 사용하는 경우 여러 Random 인스턴스가 이전만큼 위험하지 않습니다. 나는 이 질문이 2010년에 나온 것이라는 것을 알고 있지만 이 질문은 오래되었지만 약간의 매력이 있기 때문에 변경 사항을 문서화하는 것이 좋다고 생각합니다.

내가 얼마 전에 했던 이 질문을 참조할 수 있습니다.

Microsoft가 임의의 기본 시드를 변경했습니까?

기본적으로 그들은 기본 시드를 Environment.TickCount 에서 Guid.NewGuid().GetHashCode() 로 변경했으므로 Random 인스턴스 2개를 생성하면 동일한 숫자가 표시되지 않습니다.

https://github.com/dotnet/coreclr/pull/2192/commits/9f6a0b675e5ac0065a268554de49162c539ff66d 에서 .NET Framework/.NET Core(2.0.0+)의 파일 차이점을 볼 수 있습니다.

RNGCryptoServiceProvider만큼 안전하지는 않지만 적어도 이상한 결과를 제공하지는 않습니다.


Lucca Ferri

매번 새로운 랜덤 생성기를 사용할 때 어떤 일이 일어나는지 보여주고 싶었습니다. 난수를 필요로 하는 두 개의 메서드 또는 두 개의 클래스가 있다고 가정합니다. 그리고 순진하게 다음과 같이 코딩합니다.

 public class A { public A() { var rnd=new Random(); ID=rnd.Next(); } public int ID { get; private set; } } public class B { public B() { var rnd=new Random(); ID=rnd.Next(); } public int ID { get; private set; } }

두 개의 다른 ID를 얻을 것이라고 생각하십니까? 아니요

 class Program { static void Main(string[] args) { A a=new A(); B b=new B(); int ida=a.ID, idb=b.ID; // ida = 1452879101 // idb = 1452879101 } }

해결책은 항상 단일 정적 랜덤 생성기를 사용하는 것입니다. 이와 같이:

 public static class Utils { public static readonly Random random=new Random(); } public class A { public A() { ID=Utils.random.Next(); } public int ID { get; private set; } } public class B { public B() { ID=Utils.random.Next(); } public int ID { get; private set; } }

John Alexiou

강력한 랜덤 시드의 경우 항상 Time이 아닌 CryptoRNG를 사용합니다.

 using System; using System.Security.Cryptography; public class Program { public static void Main() { var random = new Random(GetSeed()); Console.WriteLine(random.Next()); } public static int GetSeed() { using (var rng = new RNGCryptoServiceProvider()) { var intBytes = new byte[4]; rng.GetBytes(intBytes); return BitConverter.ToInt32(intBytes, 0); } } }

Davit Tvildiani

Random random = new Random (); int randomNumber = random.Next (lowerBound,upperBound);

ReRoute

컴퓨터가 결정적 과정을 통해 계산한 숫자는 정의상 무작위일 수 없습니다.

진짜 난수를 원하면 무작위성은 대기 잡음이나 방사성 붕괴에서 비롯됩니다.

예를 들어 RANDOM.ORG를 시도할 수 있습니다(성능 저하).


Stefano Lonati

Random rand = new Random(); int name = rand.Next()

두 번째 괄호에 원하는 값을 입력하고 코드를 생성하기 위해 prop 및 더블 탭을 작성하여 이름을 설정했는지 확인하십시오.


user3773367

CSRNG가 최소값과 최대값 사이의 난수를 생성하도록 하려면 이것이 적합합니다. 안전한 랜덤 시드로 Random 클래스를 초기화합니다.

 class SecureRandom : Random { public static byte[] GetBytes(ulong length) { RNGCryptoServiceProvider RNG = new RNGCryptoServiceProvider(); byte[] bytes = new byte[length]; RNG.GetBytes(bytes); RNG.Dispose(); return bytes; } public SecureRandom() : base(BitConverter.ToInt32(GetBytes(4), 0)) { } public int GetRandomInt(int min, int max) { int treashold = max - min; if(treashold != Math.Abs(treashold)) { throw new ArithmeticException("The minimum value can't exceed the maximum value!"); } if (treashold == 0) { throw new ArithmeticException("The minimum value can't be the same as the maximum value!"); } return min + (Next() % treashold); } public static int GetRandomIntStatic(int min, int max) { int treashold = max - min; if (treashold != Math.Abs(treashold)) { throw new ArithmeticException("The minimum value can't exceed the maximum value!"); } if(treashold == 0) { throw new ArithmeticException("The minimum value can't be the same as the maximum value!"); } return min + (BitConverter.ToInt32(GetBytes(4), 0) % treashold); } }

Jessie Lesbian

죄송합니다. OP에는 실제로 임의의 int BigInteger 값을 원하는 경우 지식을 공유하기 위한 간단한 목적으로 다음 문을 사용할 수 있습니다.

 BigInteger randomVal = BigInteger.Abs(BigInteger.Parse(Guid.NewGuid().ToString().Replace("-",""), NumberStyles.AllowHexSpecifier));

Ciro Corvino

System.Random과 동일한 방식으로 더 잘 캐시되는 유틸리티 함수 또는 서비스가 많이 있으므로 일반 구현에 적합합니다.

 static public class CachedService<T> where T : new() { static public T Get { get; } = new T(); }

무작위(또는 유사)에 사용하려면:

 CachedService<System.Random>.Get.Next(999);

Matt Parkins

아래와 같이 균일하게 분포된 난수 생성기를 원한다고 가정하겠습니다. C# 및 C++를 포함한 대부분의 프로그래밍 언어에서 난수는 사용하기 전에 적절히 섞이지 않습니다. 이것은 실제로 무작위가 아닌 동일한 숫자를 계속해서 얻게 된다는 것을 의미합니다. 같은 숫자를 계속해서 그리지 않으려면 시드가 필요합니다. 일반적으로 이 작업에는 시간을 확인하는 것이 좋습니다. 매번 같은 시드를 사용한다면 같은 숫자를 계속해서 얻게 된다는 것을 기억하십시오. 따라서 항상 다양한 종자를 사용하십시오. 시간은 항상 변하기 때문에 씨앗의 좋은 원천입니다.

 int GetRandomNumber(int min, int max) { Random rand = new Random((int)DateTime.Now.Ticks); return rand.Next(min, max); }

정규 분포를 위한 난수 생성기를 찾고 있다면 Box-Muller 변환을 사용할 수 있습니다. Random Gaussian Variable Question에서 yoyoyoyosef의 답변을 확인하십시오. 정수를 원하기 때문에 마지막에 double 값을 정수로 변환해야 합니다.

 Random rand = new Random(); //reuse this if you are generating many double u1 = 1.0-rand.NextDouble(); //uniform(0,1] random doubles double u2 = 1.0-rand.NextDouble(); double randStdNormal = Math.Sqrt(-2.0 * Math.Log(u1)) * Math.Sin(2.0 * Math.PI * u2); //random normal(0,1) double randNormal = mean + stdDev * randStdNormal; //random normal(mean,stdDev^2)

랜덤 가우스 변수


auto9817

C#에서 난수를 얻으려면

 Random rand = new Random(); int i = rand.Next();

난수를 생성하려면 다음과 같은 난수 생성기를 사용할 수 있습니다.


karaimadai

int randomNumber = Random.Range(start_range, end_range) 사용하지 않는 이유는 무엇입니까?


Recomer

Random의 한 인스턴스를 반복적으로 사용

 // Somewhat better code... Random rng = new Random(); for (int i = 0; i < 100; i++) { Console.WriteLine(GenerateDigit(rng)); } ... static int GenerateDigit(Random rng) { // Assume there'd be more logic here really return rng.Next(10); }

이 기사에서는 무작위성이 그토록 많은 문제를 일으키는 이유와 해결 방법을 살펴봅니다. http://csharpindepth.com/Articles/Chapter12/Random.aspx


Ankit Agarwal

난수를 생성하려면 다음의 간단한 단계를 시도하십시오.

함수 생성:

 private int randomnumber(int min, int max) { Random rnum = new Random(); return rnum.Next(min, max); }

난수를 사용하려는 위치에서 위의 기능을 사용하십시오. 텍스트 상자에서 사용하려고 한다고 가정합니다.

 textBox1.Text = randomnumber(0, 999).ToString();

0은 최소이고 999는 최대입니다. 값을 원하는 대로 변경할 수 있습니다.


Hani Mehdi

나는 항상 다양한 목적에 도움이 되는 난수를 생성하는 방법을 가지고 있습니다. 이것이 당신에게도 도움이 되기를 바랍니다.

 public class RandomGenerator { public int RandomNumber(int min, int max) { var random = new Random(); return random.Next(min, max); } public string RandomString(int size, bool lowerCase) { var builder = new StringBuilder(); var random = new Random(); char ch; for (int i = 0; i < size; i++) { ch = Convert.ToChar(Convert.ToInt32(Math.Floor(26 * random.NextDouble() + 65))); builder.Append(ch); } if (lowerCase) return builder.ToString().ToLower(); return builder.ToString(); } }

PatsonLeaner

인라인을 위해 빠르고 쉽게 다음 코드를 사용하십시오.

 new Random().Next(min, max); // for example unique name strName += "_" + new Random().Next(100, 999);

Zolfaghari

출처 : http:www.stackoverflow.com/questions/2706500/how-do-i-generate-a-random-int-number

반응형