C # رمز فقط يعطي النتائج المتوقعة على الخطوة؟

StackOverflow https://stackoverflow.com/questions/1492587

  •  18-09-2019
  •  | 
  •  

سؤال

حسنا، لدي تطبيق رمي النرد ...

عندما أتحدث من خلال التعليمات البرمجية، فإنها تعمل بشكل طبيعي و "النتائج" تحتوي على العدد الصحيح من نتائج رميها ويبدو أنها عشوائية، عندما أترك التعليمات البرمجية لتشغيلها والقيام بنفس الشيء الذي ينتج تماما مجموعة من الأرقام المتطابقة.

أنا متأكد من أن هذا خطأ منطقي لا أستطيع أن أرى إلا أن الاضطراب معها لساعات لم يحسن الوضع، لذلك فإن أي مساعدة لكمتجمت كثيرا. :)

    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;
    }
}
هل كانت مفيدة؟

المحلول

خطأ الأول: لا تستخدم مثيلات متعددة عشوائية، واستخدام مثيل واحد، وتمرير ذلك إلى جانب المعلمات الأخرى.

نصائح أخرى

عند إنشاء "RND عشوائي = جديد عشوائي ()؛" انها مصفاة من الوقت الحالي. عند تصحيح التعليمات البرمجية الخاصة بك (والتي تستغرق وقتا)، سيتم تصويرها بشكل مختلف في كل مرة.

قم بإنشاء مثيل واحد من عشوائي، والمرجع الذي في كل مكان.

أنت تقوم بإنشاء فئة عشوائية في كل مرة تحتاج فيها لإنشاء رقم. القيام بذلك سيعطيك نتائج جوزي.

انظر هنا: من MSDN.

يمكن تجنب هذه المشكلة عن طريق إنشاء كائن عشوائي واحد بدلا من العديد منها.

لتحسين الأداء، قم بإنشاء كائن عشوائي واحد لإنشاء العديد من الأرقام العشوائية بمرور الوقت، بدلا من إنشاء كائنات عشوائية جديدة بشكل متكرر لتوليد رقم عشوائي واحد.

على سبيل المثال إنشاء مثيل خاص للعشوائية ...

بالإضافة إلى ما ذكره قبل ...

استخدم عشوائيا للأشياء مثل النرد وألعاب البطاقات وخيانة الصور العشوائية وما إلى ذلك. إذا كنت بحاجة إلى إنشاء رقم عشوائي للأمان، استخدم System.Security.cryptography.randomnbandgenerator. يظهر هذا المثال البسيط إنشاء عدد صحيح عشوائي.

        RandomNumberGenerator gen = RandomNumberGenerator.Create();
        byte[] myBytes = new byte[4];
        gen.GetBytes(myBytes);
        int myValue = (BitConverter.ToInt32(myBytes, 0));

لا تستخدم هذا ما لم يكن لديك حاجة أمنية. الأداء أقل من ذلك من الطبقة العشوائية. أفترض أنك يمكن أن تستخدم هذا إلى البذور عشوائي ولكن قد يكون ذلك مبالا.

تحرير: حدث لي أنني لم اختبر هذا أبدا. أظهر اختبار أداء سريع ما يلي:

1،000،000 أرقام عشوائية: RandomNBressionerator: 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