for - srand c#




어떻게하면 C#에서 임의의 int 번호를 생성합니까? (18)

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


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

using System;
using MiscUtil;

class Program
{
    static void Main(string[] args)
    {
        for (int i = 0; i < 100; i++)
        {
            Console.WriteLine(StaticRandom.Next());
        }
    }
}

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

진정한 난수를 원한다면 RNGCryptoServiceProvider 와 같은 C #의 암호화 클래스를 사용하여 생성 할 수있는 "안전한 Pseudo Random Generator"를 얻을 수 있습니다.

그렇더라도 진정한 난수가 필요한 경우 난수 생성기의 시드로 방사성 붕괴를 설명하는 장치와 같은 외부 소스를 사용해야합니다. 정의 상 순전히 알고리즘 적 수단에 의해 생성 된 모든 숫자는 진정으로 무작위 적이 지 못합니다.


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

당신이 진정한 난수를 원한다면, 난수는 대기 소음이나 방사성 붕괴로부터옵니다.

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


괜찮 으면서 :

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

대부분의 경우 한계 (최소 및 최대 mumber)를 제어하려고합니다. 따라서 난수가 시작하고 끝나는 곳을 지정해야합니다.

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

그래서 임의의 숫자가 5에서 15 사이의 숫자가되도록하려면

int randomNumber = random.Next(5, 16)

나는 코볼 답변을 제외하고 이러한 솔루션을 모두 시도했습니다 ... 롤

이 솔루션들 중 어느 것도 충분하지 않았습니다. 나는 int 루프를위한 fast에서 randoms를 필요로했고 매우 넓은 범위에서도 중복 된 값을 가지고 있었다. 임의의 결과를 너무 오래 정착 한 후에는이 문제를 한 번에 모두 해결하기로 결정했습니다.

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

Guid의 비 숫자를 파싱하여 임의의 정수를 만든 다음이 인스턴스를 사용하여 임의의 클래스를 인스턴스화합니다.

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

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

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

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


나는 항상 다양한 목적을 돕는 난수를 생성하는 메소드를 가지고있다. 나는 이것이 너를 도울 수 있기를 바란다.

public class RandomGenerator  
{  
    public int RandomNumber(int min, int max)  
    {  
        Random random = new Random();  
        return random.Next(min, max);  
    }  

    public string RandomString(int size, bool lowerCase)  
    {  
        StringBuilder builder = new StringBuilder();  
        Random 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();  
    }  
}

매번 새로운 임의 생성기가 사용될 때 어떤 일이 발생하는지 보여주고 싶었습니다. 두 개의 메소드 또는 두 개의 클래스 각각에 임의의 숫자가 필요하다고 가정 해보십시오. 순진하게 다음과 같이 코드를 작성하십시오.

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

무작위의 하나의 인스턴스를 반복적으로 사용하십시오.

// 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 ()을 할 때마다 초기화됩니다. 이것은 단단한 루프에서 동일한 값을 많이 얻음을 의미합니다. 하나의 무작위 인스턴스를 유지하고 동일한 인스턴스에서 다음을 계속 사용해야합니다.

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

수정 된 답변은 here .

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

Jebtek.RdRand를 포함하고 here 에 using 문을 추가하면 here 에서 최신 버전을 다운로드 할 수 있습니다. 그럼, 당신이해야 할 일은 이것뿐입니다.

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

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

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

아래 코드를 사용하여 난수를 얻습니다.

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

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

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

string randomDigits = rnd.Next().ToString().Substring(0, 8);

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

int randomNumber = Random.Range(start_range, end_range) 사용하지 않는가 int randomNumber = Random.Range(start_range, end_range) ?


이것은 제가 사용하는 수업입니다. 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);
    }
}

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 인스턴스를 유지하고 다시 사용해야합니다. 시간이 너무 가까워서 새로운 인스턴스를 생성하면 임의의 생성기가 시스템 클럭에서 파생 된 일련의 난수가 생성됩니다.


new Random() 이 현재 타임 스탬프에 시드된다는 점에 유의하십시오.

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

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

자세한 정보는 Random 클래스를 참고하십시오.

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

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


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

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

두 번째 괄호에 원하는 값을 입력하고 코드를 생성하려면 두 개의 탭을 사용하여 이름을 설정했는지 확인하십시오.





random