سؤال

أحاول استخدام C++ STD TechnicalReport1 امتداد لتوليد الأرقام التالية التوزيع الطبيعي ، ولكن هذا الرمز (مقتبس من هذه المادة):

mt19937 eng;
eng.seed(SEED);

normal_distribution<double> dist;
// XXX if I use the one below it exits the for loop
// uniform_int<int> dist(1, 52);

for (unsigned int i = 0; i < 1000; ++i) {
  cout << "Generating " << i << "-th value" << endl;
  cout << dist(eng) << endl;
}

فقط يطبع 1 "توليد..." تسجيل الرسالة ، ثم لم يخرج عن الحلقة!إذا كنت تستخدم توزيع علق بها بدلا من ذلك, ينهي, لذلك أنا أتساءل ما أفعله خطأ.أي فكرة ؟

شكرا جزيلا!

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

المحلول

هذا بالتأكيد لن يعلق البرنامج. ولكن، لست متأكدا مما إذا كان يلبي احتياجاتك حقا.

 #include <random>
 #include <iostream>

 using namespace std;

 typedef std::tr1::ranlux64_base_01 Myeng; 

 typedef std::tr1::normal_distribution<double> Mydist; 

 int main() 
 { 
      Myeng eng; 
      eng.seed(1000);
      Mydist dist(1,10); 

      dist.reset(); // discard any cached values 
      for (int i = 0; i < 10; i++)
      {
           std::cout << "a random value == " << (int)dist(eng) << std::endl; 
      }

 return (0); 
 }

نصائح أخرى

كان لدي نفس المشكلة مع الرمز نشر في الأصل والتحقيق في تنفيذ جنو

أولا بعض الملاحظات: مع G ++ - 4.4 واستخدام تعليق التعليمات البرمجية، مع G ++ - 4.5 واستخدام -STD = C ++ 0x (أي NOT TR1 ولكن الشيء الحقيقي) أعلاه ويعمل

IMHO، كان هناك تغيير بين TR1 و C ++ 0x فيما يتعلق بالمحولات بين توليد الأرقام العشوائية واستهلاك الأرقام العشوائية - MT19937 تنتج الأعداد الصحيحة، Normal_Distribution يستهلك الزوجي

يستخدم C ++ 0x Adaption تلقائيا، رمز G ++ TR1 لا

من أجل الحصول على التعليمات البرمجية الخاصة بك مع G ++ - 4.4 و TR1، قم بما يلي

std::tr1::mt19937 prng(seed);
std::tr1::normal_distribution<double> normal;
std::tr1::variate_generator<std::tr1::mt19937, std::tr1::normal_distribution<double> > randn(prng,normal);
double r = randn();

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

توليد اثنين موحدة (0, 1) عينات عشوائية u و v استخدام أي مولد عشوائي تثق به.ثم السماح ص = الجذر التربيعي( -2 سجل(u) ) والعودة x = r sin(2 pi الخامس).(يسمى هذا المربع-مولر الأسلوب.)

إذا كنت بحاجة إلى وضعها الطبيعي العينات مع عينات يعني مو سيجما الانحراف المعياري, عودة سيجما*x + مو بدلا من مجرد x.

بينما يبدو أن هذا خطأ، سيكون تأكيدا سريعا لتمرير المعلمات الافتراضية 0.0 و 1.0. normal_distribution<double>::normal_distribution() يجب أن يساوي normal_distribution<double>::normal_distribution(0.0, 1.0)

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