C# 코드는 단계를 통해 예상 결과 만 제공합니까?
문제
좋아, 나는 주사위 던지기 앱이있다 ...
코드를 밟으면 정상적으로 기능하고 '결과'에는 올바른 던지기 결과가 포함되어 있으며 코드를 실행하고 정확히 동일한 작업을 수행 할 때 동일한 숫자 세트를 생성 할 때 무작위로 보입니다.
나는 이것이 내가 볼 수없는 논리적 오류라고 확신하지만 몇 시간 동안 그것으로 가면 상황이 향상되지 않았으므로 모든 도움이 그다지 감사합니다. :)
class Dice
{
public int[] Roll(int _throws, int _sides, int _count)
{
Random rnd = new Random();
int[] results = new int[_throws];
// for each set of dice to throw pass data to calculate method
for (int i = 0; i < _throws; i++)
{
int thisThrow = Calculate(_sides, _count);
//add each throw to a new index of array... repeat for every throw
results[i] = thisThrow;
}
return results;
}
private int Calculate(int _sides, int _count)
{
Random rnd = new Random();
int[] result = new int[_count];
int total = 0;
//for each dice to throw put data into result
for (int i = 0; i < _count; i++)
{
result[i] = rnd.Next(1, _sides);
}
//count the values in result
for (int x = 0; x < _count; x++)
{
total = total + result[x];
}
//return total of all dice to Roll method
return total;
}
}
해결책
첫 번째 실수 : 무작위의 여러 인스턴스를 사용하지 않고 단일 인스턴스를 사용하여 다른 매개 변수와 함께 전달하십시오.
다른 팁
"random rnd = new random (); 현재 시간에 의해 시드됩니다. 코드를 디버깅 할 때 (시간이 걸리는) 매번 다르게 시드됩니다.
임의의 1 인스턴스를 생성하고 어디에서나 참조하십시오.
숫자를 만들어야 할 때마다 임의의 클래스를 만들고 있습니다. 이렇게하면 너트가 많은 결과를 얻을 수 있습니다.
여기를 봐: MSDN에서
이 문제는 여러 개체가 아닌 단일 임의의 객체를 만들어 피할 수 있습니다.
성능을 향상 시키려면 하나의 임의의 객체를 만들어 시간이 지남에 따라 많은 임의 숫자를 생성하고, 하나의 임의 숫자를 생성하기 위해 새로운 랜덤 객체를 반복적으로 작성하는 대신 많은 임의 숫자를 생성하십시오.
예 : 무작위의 개인 인스턴스를 만듭니다 ...
이전에 언급 된 것 외에도 ...
주사위, 카드 게임, 임의의 이미지 선택 등과 같은 것들에 무작위를 사용하십시오. 보안을 위해 임의의 숫자를 만들어야하는 경우 System.security.cryptography.randomnumbergenerator를 사용하십시오. 이 간단한 예는 임의의 정수를 만드는 것을 보여줍니다.
RandomNumberGenerator gen = RandomNumberGenerator.Create();
byte[] myBytes = new byte[4];
gen.GetBytes(myBytes);
int myValue = (BitConverter.ToInt32(myBytes, 0));
보안이 필요하지 않으면 이것을 사용하지 마십시오. 성능은 랜덤 클래스보다 작습니다. 나는 당신이 이것을 무작위로 씨를 뿌릴 수 있다고 생각하지만 그것은 과잉 일 수 있습니다.
편집 : 나는 이것을 테스트 한 적이 없다. 빠른 성능 테스트는 다음을 보여주었습니다.
1,000,000 랜덤 숫자 : RandomNumberGenerator : 2.6 초 임의 : .015 초.
무작위는 약 150 배 더 빠릅니다.
생성자에게 무작위로 씨앗을 제공하십시오. 그게 바로 문제 야.
http://msdn.microsoft.com/en-us/library/aa329890%28vs.71%29.aspx
Random r = new Random(DateTime.Now.Millisecond);