لماذا هذا الأسلوب بإرجاع نفس سلسلة عشوائية في كل مرة ؟
سؤال
أنا بحاجة إلى إنشاء كتلة من خطوط فريدة من نوعها لاختبار مختلف المشاريع التي أعمل عليها.
لذا قمت بإنشاء برنامج بسيط لتوليد سلسلة عشوائية من 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();
}
}
مثل هذا السؤال الكثير من الإجابات:
سلسلة عشوائية من الجيل اثنين ولدت واحدة بعد أخرى تعطي نفس النتائج
البذور على أرقام عشوائية هي كل نفس نظرا قصيرة من الوقت يستغرق في الواقع كنت إعادة مولد عشوائي مع نفس البذور في كل مرة ، وذلك في اليوم التالي() استدعاء ترجع نفس قيمة عشوائية.