문제

좋아, 나는 주사위 던지기 앱이있다 ...

코드를 밟으면 정상적으로 기능하고 '결과'에는 올바른 던지기 결과가 포함되어 있으며 코드를 실행하고 정확히 동일한 작업을 수행 할 때 동일한 숫자 세트를 생성 할 때 무작위로 보입니다.

나는 이것이 내가 볼 수없는 논리적 오류라고 확신하지만 몇 시간 동안 그것으로 가면 상황이 향상되지 않았으므로 모든 도움이 그다지 감사합니다. :)

    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);
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top