중복 임의의 값을 얻는 것을 피하기 위해 임의의 클래스를 시드하는 방법
- 난수 생성기는 하나의 난수를 생성 합니다.
정적 클래스의 정적 메서드 안에 다음 코드가 있습니다.
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 :
'Programming' 카테고리의 다른 글
이 달의 이름 (이름으로 날짜-오늘. 달) (0) | 2020.07.29 |
---|---|
Markdown Jekyll에서 이미지 캡션 사용 (0) | 2020.07.29 |
숫자를 월 이름으로 변환하는 스위치 케이스 블록을 줄이는 방법은 무엇입니까? (0) | 2020.07.29 |
adb 명령을 찾을 수 없습니다 (0) | 2020.07.29 |
adb 명령을 찾을 수 없습니다 (0) | 2020.07.29 |