Programming

중복 임의의 값을 얻는 것을 피하기 위해 임의의 클래스를 시드하는 방법

procodes 2020. 7. 29. 21:05
반응형

중복 임의의 값을 얻는 것을 피하기 위해 임의의 클래스를 시드하는 방법


이 질문에는 이미 답변이 있습니다.

정적 클래스의 정적 메서드 안에 다음 코드가 있습니다.

Random r = new Random();
int randomNumber = r.Next(1,100);

나는 이것을 루프 안에 가지고 있으며 계속 똑같이 얻고있다

randomNumber

!여기에 제안이 있으십니까?


 

Random

루프에서 인스턴스를 작성해서는 안됩니다 . 다음과 같은 것을 시도하십시오 :

var rnd = new Random();
for(int i = 0; i < 100; ++i) 
   Console.WriteLine(rnd.Next(1, 100));

단일

Random

인스턴스에 의해 생성 된 난수 시퀀스는 균일하게 분포되어야합니다.

Random

모든 난수에 대해 빠른 연속으로 인스턴스를 만들면 동일한 값으로 시드하고 동일한 난수를 생성 할 수 있습니다. 물론,이 경우, 생성 된 시퀀스는 균일 한 분포와는 거리가 멀다.완전성을 위해 실제로 시드를 다시해야하는 경우 새 시드를

Random

사용하여 새 인스턴스를 만듭니다

Random

.

rnd = new Random(newSeed);

나를위한 좋은 씨앗 생성은 다음과 같습니다.

Random rand = new Random(Guid.NewGuid().GetHashCode());

매우 무작위입니다. 씨앗도 무작위로 생성되기 때문에 씨앗은 항상 다릅니다.


약간 늦었지만 System.Random에서 사용 하는

구현

Environment.TickCount

다음과 같습니다.

public Random() 
  : this(Environment.TickCount) {
}

이렇게하면

DateTime.UtcNow.Ticks

시스템을 시작한 이후로 진드기를 나타내지 않으므로 "길이에서 캐스트 할 필요가 없지만 0001 년 1 월 1 일 자정 12시 이후에 경과 한 100 나노초 간격 수 (0 : 00 : 00 UTC, 0001 년 1 월 1 일, 그레고리력)).TestApi의 좋은 정수 시드를 찾고있었습니다.

StringFactory.GenerateRandomString


어떤 이유로 든 똑같이

Random

반복해서 사용할 수없는 경우 시간 자체와 같이 항상 변경되는 것으로 초기화하십시오.

new Random(new System.DateTime().Millisecond).Next();

이것은 나쁜 습관임을 기억하십시오.편집 : 기본 생성자는 이미 시계에서 시드를 가져 왔으며 아마도 우리보다 낫습니다. MSDN에서 인용 :

Random () : 시간 종속 기본 시드 값을 사용하여 Random 클래스의 새 인스턴스를 초기화합니다.

아래 코드는 아마도 최선의 선택 일 것입니다.

new Random().Next();

public static Random rand = new Random(); // this happens once, and will be great at preventing duplicates

이것은 암호화 목적으로 사용되지 않습니다.


이것은 나를 위해 작동합니다 :

private int GetaRandom()
    {
        Thread.Sleep(1);
        return new Random(DateTime.Now.Millisecond).Next();
    }

좋은 씨앗 초기화는 다음과 같이 수행 할 수 있습니다

Random rnd = new Random((int)DateTime.Now.Ticks);

진드기는 고유하며 값이 느슨한 int로 캐스트해도 괜찮습니다.


나는 대부분의 상황에서 이것을 사용하고 시퀀스를 반복해야 할 경우 씨앗을 유지

    var seed = (int) DateTime.Now.Ticks;
    var random = new Random(seed);

또는

    var random = new Random((int)DateTime.Now.Ticks);

참고 URL :

https://stackoverflow.com/questions/1785744/how-do-i-seed-a-random-class-to-avoid-getting-duplicate-random-values

반응형