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