난수 int 숫자를 어떻게 생성합니까?


1919

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

답변:


2501

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인스턴스를 유지 하고 재사용해야합니다. 새 인스턴스를 제 시간에 너무 가깝게 만들면 시스템 시계에서 임의 생성기가 시드 될 때와 동일한 일련의 임의의 숫자가 생성됩니다.


184
Unity C # 사용자를위한 참고 사항으로 Unity에는 충돌하는 "UnityEngine.Random ()"이 있으므로 "System.Random ()"을 지정해야합니다 ( "UnityEngine.Random ()"에는 임의의 생성 기능이 없음에 유의하십시오) 번호). 유니티가 기본적으로 항상 시스템을 가져 오지는 않기 때문에 약간의 혼란이 발생할 수 있습니다.
Joehot200

2
재사용하기 위해, 당신은 선언 할 수 rndstatic및 / 또는 코드를 초기화 할 때 한 번만 설정합니다.
Junior Mayhé

4
@ JuniorM : 예, 재사용 할 수 있도록 정적으로 만들 수는 있지만 스레드 안전하지 않기 때문에 여러 스레드에서 액세스 할 수 없도록주의해야합니다 (특별히 스레드 안전하지 않은 클래스의 경우와 마찬가지로) ).
Guffa

8
누군가가 맹목적으로 암호화를 시도하는 경우를 대비하여 인기있는 질문이기 때문에 이것이 암호 적으로 안전하지 않다는 고지 사항을 추가하는 것이 유용하다고 생각합니다 Random.
Daniel García Rubio

1
훌륭한 답변입니다. ericlippert.com/2019/02/04/fixing-random-part-2codeblog.jonskeet.uk/2009/11/04/revisitingRandom : 임의성을 보다 견고하게 만들기위한 몇 가지 좋은 "향상된 기능"이 있습니다. 임의성 .
Jesse C. Slicer

280

질문은 매우 단순 해 보이지만 대답은 약간 복잡합니다. 거의 모든 사람들이 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를 사용하면 안전한 임의의 숫자가 생성됩니다.


9
ToInt32가 4 바이트 만 구문 분석 할 때 바이트 [5] 만 [4]이 아니어야합니까?
Bernhard

6
이 수업이 어디에 있는지 아는 것이 항상 도움이됩니다. System.Security.Cryptography
Elton

1
모든 플랫폼에서 사용 가능한 것은 아니기 때문에 RandomNumberGenerator.Create()생성자를 호출하는 대신 사용 하는 것이 좋습니다 RNGCryptoServiceProvider.
dzitkowskik

SecureRandom IS 의사 무작위 생성이라는 것을 정확하게 알고 싶습니다.
Nùménor

시드의 무작위성이 증가했기 때문에 난수를 생성해야 할 때마다 새로운 RNGCryptoServiceProvider 객체를 생성해도 괜찮습니까? 또는 RNGCryptoServiceProvider 객체를 하나 생성하여 난수를 생성해야 할 때마다 재사용하는 것이 좋습니다. Random 클래스로 수행해야합니까?
user2150989

231

새로운 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);
    }
}

3
6 개월 전에 @Guffa가 대답 한 내용이 아닙니까? "새로운 인스턴스를 제 시간에 너무 가깝게 만들면 동일한 일련의 난수가 생성됩니다"
Chris

3
@ Chris- 네 말이 맞아. 이것에서 나는 그 구현을 제공했다. 나는 그것을하는 좋은 방법이라고 생각합니다. 더 잘 작동합니다.
Pankaj Mishra

22
이것은 seval 스레드에서 사용하기 위해 코드를 동기화하는 구현입니다. 다중 스레드 응용 프로그램에는 좋지만 단일 스레드 응용 프로그램에는 시간이 낭비됩니다.
Guffa

@SeanWorle : 먼저 Guffa의 접근 방식으로 시도했습니다. 그런 다음 동일한 Random객체 를 저장하려고했습니다 . 두 경우 모두 동일한 난수를 얻었습니다. Pankaj의 접근 방식으로는 발생하지 않았습니다. 아마도 이것은 임의적 이지만 지금은 의심 스럽습니다. 다른 스레드에서 동일한 초에 임의의 숫자를 쿼리하고 있습니다.
테스트

1
@ testing : Pankaj의 방법이 올바른 방법이라는 데 동의합니다. 내가 말하는 것은 다음과 같이 단순화 될 수 있다는 것입니다. // 난수를 얻는 함수 private static readonly Random getrandom = new Random (); public static int GetRandomNumber (int min, int max) {lock (getrandom) {// 반환 동기화 getrandom.Next (min, max); }}
Sean Worle

92

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

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

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

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

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

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


41
-1 : 기본 시드는 시간을 기준으로합니다. 루프 에서이 작업을 수행하면 무작위가 아닌 결과를 얻을 수 있습니다. 당신은 작성해야 하나 생성기를 그리고 그것은 모든 숫자가 아닌 별도의 발생 때마다 사용합니다.
Bevan

21
이봐, 그건 불공평 해 문제는 임의의 int 숫자를 생성하는 방법이었습니다. 루프 나 시리즈는 언급되지 않았습니다.
Fyodor Soikin

26
알았어, 페어 포인트 철회. 그래도 new Random()루프에서 사용하지 않는 것이 중요한 포인트 라고 생각합니다 .
Bevan

앞으로이 문제를 겪는 사람들에게는 지금 당연한 것이지만, 나는 그것을 지적 할 것입니다. 여러 값에 대해 루프에서 이것을 사용하지 않도록 대답 이이 시점으로 업데이트되었습니다.
vapcguy


30

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

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

15

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

using MiscUtil;
...

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

31
방금 소스 코드를 살펴본 결과이 함수는 C #에 "포함 된"엔진과 정확히 동일한 난수 엔진을 사용하지만 모든 호출에 동일한 "시드"/ "어머니 오브젝트"가 사용되도록합니다. (C # 용어를 모르는 것이 유감입니다.하지만 요점은이 함수가 표준 함수보다 더 나은 난수를 만들지 않는다는 것입니다.)
Andreas Rejbrand

5
존재 자체에 내재 된 제한 요소 나 편견이 항상 있기 때문에 어떤 것이 든 '무작위로되는'것은 불가능합니다. 과학 수업에서 선생님의 말을 듣지 않았습니까? ;-)
Phill Healey

그에 따르면, 이것은 '진정한 무작위'입니다
Mitra Boy

링크가 끊어졌습니다. 당신이 당신의 답변에 찾은 정보를 포함하는 이유입니다.
vapcguy

13

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

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

씨앗에 관한 모든 것입니다.

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

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


6
길드는 무작위가 아니며 좋은 씨앗이 아닙니다. GUID는 임의성을 보장하지 않으며 고유성을 보장합니다. stackoverflow.com/questions/2621563/…
Magu

2
길드는 좋은 씨앗입니다. Guid의 숫자 만 사용하고 있습니다. 스스로 방법을 시도하십시오. 긴 for 루프에 넣고 결과를 직접보십시오.
Proximo

1
흠, 두번째 생각에 .. 씨앗은 전혀 필요하지 않습니다. 답변 업데이트
Proximo

1
업데이트에 대한 좋은 지적. 나는 그것을 정적 필드로 생각조차하지 않았다.이 방법은 훨씬 잘 작동하고 깨끗합니다.
JCisar

1
이 답변에는 몇 가지 문제가 있습니다. 우선 모든 GUID는 훌륭한 시드 소스가 아닙니다. 무작위로 보인다고해서 반드시 그렇지는 않습니다. 그것은 귀하의 개인 요구에 충분합니다. 두 번째로 Random 클래스는 스레드로부터 안전하지 않습니다. 스레드 당 한 번 인스턴스화해야합니다.
헥터

11

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

진정한 난수를 원한다면 C #의 암호화 클래스를 사용하여 생성 할 수있는 "secure pseudo random generator"가 가장 가깝습니다 RNGCryptoServiceProvider.

그럼에도 불구하고 여전히 실제 난수가 필요한 경우 방사성 붕괴를 설명하는 장치와 같은 외부 소스를 난수 생성기의 시드로 사용해야합니다. 정의상 순전히 알고리즘적인 수단으로 생성 된 숫자는 실제로 임의의 숫자 일 수 없습니다.


11

랜덤 오브젝트를 생성

Random rand = new Random();

그리고 그것을 사용하십시오

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

new Random()임의의 숫자가 필요할 때마다 초기화 할 필요가 없으며 임의의 숫자를 시작한 다음 루프 내에서 필요한 횟수만큼 사용하십시오.


5
new Random()현재 진드기를 시드로 사용합니다. 동일한 밀리 초 내에 여러 인스턴스를 인스턴스화하면 (틱이 아닌) 동일한 값이 반환됩니다.
Hans Ke st ing

10
이것은 적극적으로 나쁘다. DateTime.Now.Millisecond (DateTime.Now.Ticks와 달리)는 0에서 999 사이의 숫자입니다. 각 난수에 대해 이들 중 하나를 새로 만드는 경우에는 1000 개의 가능성 만 있습니다.
Oren Melzer

이 답변을 투표하는 데 24 명이 무슨 생각을했는지 ...?
수수께끼

10

여기 에서 수정 된 답변입니다 .

Intel Secure Key 호환 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>");

7

아래 코드를 사용하여 임의의 숫자를 사용했습니다 (권장하지 않음).

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

4

이것은 괜찮지 만 :

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

대부분의 시간에 한계 (최소 및 최대 mumbers)를 제어하려고합니다. 따라서 임의의 숫자가 시작하고 끝나는 위치를 지정해야합니다.

Next()방법은 최소 및 최대의 두 매개 변수를 허용합니다.

내 임의의 숫자가 5와 15 사이에 있기를 원한다면 그냥 할 것입니다.

int randomNumber = random.Next(5, 16)

4

이것이 내가 사용하는 수업입니다. 처럼 작동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);
    }
}

GenerateRandom 클래스는 숫자 666, 665 만 반환하지 않습니다. 이는 Random.Next max 값의 일반적인 오해 (기능)입니다.
Gordon Bell

3

매번 새로운 랜덤 생성기를 사용할 때 어떤 일이 발생하는지 보여주고 싶었습니다. 각각 임의의 숫자가 필요한 두 개의 메소드 또는 두 개의 클래스가 있다고 가정하십시오. 그리고 순진하게 당신은 그들을 다음과 같이 코딩합니다 :

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

그러면 씨앗을 어떻게 안전하게 선택합니까?
ja72

먼저, 개체가 10ms 떨어져도 생성되면 생성 된 난수는 기본 시드와 다릅니다. 둘째, 시드를 얻기 위해 주변에있는 임의의 환경 또는 프로세스 데이터를 매시 할 수 있습니다. 그런 다음 스스로 반복하기 시작하는 긴 일련의 숫자 또는 두 개의 스트림이 동일한 경우에도 여러 개의 스트림을 원하는지 여부와의 상충 관계가 있습니다. 그리고 보안이 걱정된다면 RNGCryptoServiceProvider어쨌든 더 나은 통화입니다.
Millie Smith

방사능 붕괴 (매우 무작위 임)에 따라 숫자를 무작위 화하기 위해 작은 알파 입자 방사성 소스와 감지기 (연기 감지기 작동 방식)가있는 무작위 화 칩을 갖는 것이 좋습니다.
ja72

3

강력한 랜덤 시드의 경우 항상 시간이 아닌 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);
        }
    }
}

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

1
이 코드는 질문에 대답 할 수 있지만 문제를 해결하는 방법을 설명하고 코드를 예제 또는 참조로 제공하는 것이 좋습니다. 코드 전용 답변은 혼란스럽고 컨텍스트가 부족할 수 있습니다.
Robert Columbia

3

나중에 참조 할 수 있도록 참고하십시오.

.NET Core를 사용하는 경우 여러 랜덤 인스턴스는 이전처럼 위험하지 않습니다. 나는이 질문이 2010 년이라는 것을 알고 있지만이 질문은 오래되었지만 매력이 있기 때문에 변경 사항을 문서화하는 것이 좋습니다.

내가 잠시 전에 만든이 질문을 언급 할 수 있습니다.

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

기본적으로 기본 시드가에서 (으) Environment.TickCount로 변경되었습니다. Guid.NewGuid().GetHashCode()따라서 임의의 인스턴스 2 개를 생성하면 동일한 숫자가 표시되지 않습니다.

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

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


현재는 구식입니다. Guids 사용에 대한 상당한 반발이있었습니다. 코드는 이제 Interop.GetRandomBytes((byte*)&result, sizeof(int));입니다.
수수께끼

2

결정 론적 프로세스를 통해 컴퓨터에 의해 계산 된 숫자는 정의에 따라 무작위 일 수 없습니다.

당신이 진짜 난수를 원한다면, 임의성은 대기 소음이나 방사성 붕괴에서 비롯됩니다.

예를 들어 RANDOM.ORG를 사용해 볼 수 있습니다 (성능이 저하됩니다)


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

두 번째 괄호 안에 원하는 값을 넣으면 prop 및 double tab을 작성하여 코드를 생성하여 이름을 설정했는지 확인하십시오.


1
소품과 더블 탭?
DCShannon

소품과 더블 탭 입니까? 속성의 약어 인 단축키 를 사용하지 않으면 코드가 작동하지 않습니까?
Sнаđошƒаӽ

2

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

1

죄송하지만 OP에는 실제로 임의의 int값이 필요 하지만 임의의 값을 원할 경우 지식을 공유 BigInteger하기 위해 다음과 같은 진술을 사용할 수 있습니다.

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

0

아래처럼 균일하게 분포 된 난수 생성기를 원한다고 가정합니다. 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)

랜덤 가우스 변수


0

가장 쉬운 방법은 아마도 Random.range(1, 3)1과 2 사이의 숫자를 생성하는 것입니다.


-1

아래를 사용하여 임의의 시드 값으로 시도 할 수 있습니다.

var rnd = new Random(11111111); //note: seed value is 11111111

string randomDigits = rnd.Next();

var requestNumber = $"SD-{randomDigits}";

MikaelDúiBolinder @ 덕분에이 snipet 볼
Rejwanul 창문 격자

-2

왜 사용하지 int randomNumber = Random.Range(start_range, end_range)않습니까?


실제로 int randomNumber = Random.Range (start_range, end_range + 1)
Gordon Bell

3
Random.Range ()가 있습니까? MSDN 설명서에서 찾을 수 없습니다.
Phillip Ngan

MSDN 설명서에서도 Random.Range ()를 찾을 수 없습니다
user2455111

-2

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


Random스레드 안전 클래스가 아닙니다. 단일 인스턴스를 작성하는 경우 잠금 메커니즘 뒤에서 액세스를 제한해야합니다.
Brad M

-2

임의의 숫자를 만들려면 다음 간단한 단계를 수행하십시오.

함수 만들기 :

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

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

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

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


이것은 시스템 시간을 시드로 사용하기 때문에 여러 번 밀접하게 호출되면 같은 숫자를 반환합니다 ...
MOnsDaR

1
randomnumber (0, 999)는 999를 반환하지 않습니다. 최대 값은 포함되지 않습니다. 이는 Random.Next max 값의 일반적인 오해 (기능)입니다.
Gordon Bell

-2

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

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

-3

인라인을위한 빠르고 쉬운 다음 코드를 사용하십시오.

new Random().Next(min, max);

// for example unique name
strName += "_" + new Random().Next(100, 999);
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.