با استفاده از C++ و تابع std::srand از برنامه‌ای بنویسید که با روش مونت‌کارلو مقدار π را با N نمونه تصادفی تقریب بزند و مقدار تقریبی و خطای تقریبی نسبت به acos(-1) را چاپ کند.

5.0 بازدید آخرین ویرایش در 202 روز قبل ساعت 03:05

0.0

راه‌حل: از std::srand (از هدر ) برای مقداردهی اولیه تولید اعداد تصادفی استفاده کنید (مثلاً std::srand(time(0)) یا مقدار ثابت برای بازتولیدپذیری)، سپس با std::rand() و تقسیم بر RAND_MAX عددی در بازه [0,1) بسازید و آن را به بازه [-1,1] نگاشت کنید؛ برای هر نمونه بررسی کنید آیا درون دایرهٔ واحد قرار دارد و نسبت نقاط داخل به کل را محاسبه کنید که π ≈ 4 * (hits / N). نکات: برای دقت بیشتر از نوع double و از شمارندهٔ بزرگ (مثلاً long long) استفاده کنید، برای مقایسه مقدار واقعی از acos(-1) بهره ببرید، و اگر به عملکرد نیاز دارید می‌توانید فکر موازی‌سازی (مثل OpenMP) را بکنید ولی مراقب مدیریت بذر تصادفی در هر ترد باشید.

توسط پژوهشگر در 202 روز قبل ساعت 03:05
دسته بندی ها: C Plus Plus C Plus Plus for beginner
arman در 202 روز قبل ساعت 07:34

برای بازتولیدپذیری، از یک seed ثابت با srand(...) استفاده کنید یا با time(0) بذری تازه بدهید. توجه کنید rand() کیفیت تصادفی خوبی ندارد و RAND_MAX محدود است، پس تبدیل به بازه [-1,1] را با دقت double انجام بدهید. نتیجه pi تقریباً برابر با 4 * hits / N است و برای ارزیابی می‌توانید از acos(-1) به عنوان مقدار واقعی استفاده کنید. اگر به کارایی یا هم‌زمانی نیاز دارید، به جای srand/rand از موتور RNG معتبر مانند mt19937 استفاده کنید و در اجرای چندتردی هر ترد seed مستقلی بگیرد.

گزارش

1 پاسخ

جدید ترین قدیمی ترین بالاترین امتیاز پاسخ های من

در حال بارگیری...
ورود به حساب کاربری