لماذا هذا الأسلوب بإرجاع نفس سلسلة عشوائية في كل مرة ؟

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

  •  03-07-2019
  •  | 
  •  

سؤال

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

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

المسألة هي أنه إذا اتصل مرة أحصل على سلسلة عشوائية ، إذا أتصل عليه مرة أخرى (في حلقة على سبيل المثال) أحصل على نفس السلسلة بأكملها تنفيذ الحلقة.

لدي شعور أنه يجري مؤقتا أو شيء ولكن لم أكن أعرف .صافي فعلت ذلك وأنا مجرد الخلط في هذه النقطة.

رمز الاتصال:

    StreamWriter SW = new StreamWriter("c:\\test.txt");
    int x = 100;
    while (x >0)
    {
        SW.WriteLine(RandomString(20));
        x--;
    }

هنا هو الطريقة:

private static string RandomString(int Length)
{
    StringBuilder sb = new StringBuilder();
    Random randomNumber = new Random();

    for (int i = 0; i <= Length; ++i)
    {
        int x = randomNumber.Next(65, 122);
        sb.Append(Convert.ToChar(x));
    }
    return sb.ToString();        
}

و هنا هو الإخراج:

"VEWMCQ`Fw]TvSFQawYnoB
VEWMCQ`Fw]TvSFQawYnoB
VEWMCQ`Fw]TvSFQawYnoB
VEWMCQ`Fw]TvSFQawYnoB
VEWMCQ`Fw]TvSFQawYnoB
VEWMCQ`Fw]TvSFQawYnoB
..................
VEWMCQ`Fw]TvSFQawYnoB
VEWMCQ`Fw]TvSFQawYnoB
VEWMCQ`Fw]TvSFQawYnoB
VEWMCQ`Fw]TvSFQawYnoB
VEWMCQ`Fw]TvSFQawYnoB"

حتى ما يعطي ظننت عشوائي.التالي() دوما بإرجاع عشوائي جديد ؟

هل كانت مفيدة؟

المحلول

أنت خلق Random حالات قريبة جدا في الوقت.كل مثيل initialised باستخدام النظام على مدار الساعة و على مدار الساعة كما لم تتغير يمكنك الحصول على نفس تسلسل أرقام عشوائية مرارا وتكرارا.

إنشاء مثيل واحد من Random فئة استخدامها مرارا وتكرارا.

استخدام using الكلمات الرئيسية بحيث StreamWriter مغلقة والتخلص منها عندما كنت فعلت مع ذلك.رمز حلقة السهل التعرف إذا كنت تستخدم for الكلمات الرئيسية.

using (StreamWriter SW = new StreamWriter("c:\\test.txt")) {
   Random rnd = new Random();
   for (int x = 100; x > 0; x--) {
      SW.WriteLine(RandomString(rnd, 20));
   }
}

الأسلوب يأخذ Random كائن كمعلمة.

أيضا, استخدام طول التهيئة بـ stringbuilder على الصحيح القدرات بحيث لا تضطر إلى تخصيص خلال الحلقة.استخدام < مشغل بدلا من <= في الحلقة ، وإلا سوف إنشاء سلسلة حرف واحد أطول من length المعلمة.

private static string RandomString(Random rnd, int length) {
   StringBuilder sb = new StringBuilder(length);
   for (int i = 0; i < length; i++) {
      int x = rnd.Next(65, 122);
      sb.Append((char)x);
   }
   return sb.ToString();        
}

نصائح أخرى

انظر عشوائية منشئ الوصف في MSN, هذا الجزء:

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

لذا إما دعوة عشوائية() منشئ مرة واحدة فقط في بداية البرنامج أو استخدام عشوائي(int32) منشئ وتحديد متفاوتة البذور نفسك.

لأن إنشاء عشوائية جديدة كائن في كل مكالمة.

ببساطة تحريك randomNumber من طريقة تجعل فئة الأعضاء.

private Random randomNumber = new Random();
private static string RandomString(int Length)
{
    StringBuilder sb = new StringBuilder();
    //...
}

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

تحرير:على ما يبدو .صافي عشوائية فئة السيارات البذر, لم أكن أعرف ذلك.لذلك هي مشكلة التوقيت ، كما أشار آخرون.

إلا أن تعلن randomNumber مرة واحدة



public class MyClass
{
    private static Random randomNumber = new Random();

    private static string RandomString(int Length)
    {
        StringBuilder sb = new StringBuilder();  

        for (int i = 0; i ... Length; ++i)
        {
        int x = MyClass.randomNumber.Next(65, 122);
        sb.Append(Convert.ToChar(x));
        }
        return sb.ToString();        
    }
}

البذور على أرقام عشوائية هي كل نفس نظرا قصيرة من الوقت يستغرق في الواقع كنت إعادة مولد عشوائي مع نفس البذور في كل مرة ، وذلك في اليوم التالي() استدعاء ترجع نفس قيمة عشوائية.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top