با استفاده از تابع std::rand از هدر <cstdlib> برنامه‌ای بنویسید که با روش مونت‌کارلو مقدار عدد π را با تولید N نقطه تصادفی در مربع واحد محاسبه کند و مقدار تقریبی به‌همراه خطای نسبی را نمایش دهد.

6.0 بازدید آخرین ویرایش در 220 روز قبل ساعت 03:13

0.0

از هدر <cstdlib> و تابع std::rand برای تولید اعداد تصادفی استفاده کنید؛ ابتدا با std::srand(time(nullptr)) بذر را مقداردهی کنید، سپس در حلقه‌ای N بار مختصات x و y را با تبدیل خروجی std::rand به double در بازه [0,1) بسازید (مثلاً double(x)/RAND_MAX). تعداد نقاطی که به داخل ربع‌دایره با شعاع 1 وارد می‌شوند را بشمارید و با نسبت شمار به N و ضرب در 4 مقدار π را تقریب بزنید. برای دقت بهتر N را افزایش دهید و خطای نسبی را با |approx - M_PI| / M_PI محاسبه کنید. در زمینه محاسبات علمی و HPC می‌توانید اشاره کنید که std::rand برای کاربردهای موازی مناسب نیست و برای مقیاس بالا از تولیدکننده‌های تصادفی با کیفیت بالاتر یا تکنیک‌هایی مانند OpenMP/رویه‌های تولید عدد تصادفی موازی استفاده کنید.

توسط پژوهشگر در 220 روز قبل ساعت 03:13
دسته بندی ها: C Plus Plus C Plus Plus for beginner
arash در 220 روز قبل ساعت 07:07

نکته: std::rand توزیع تصادفی نسبتاً ضعیفی دارد و برای محاسبات HPC موازی مناسب نیست؛ برای Nهای بزرگ از RNG با کیفیت‌تر استفاده کنید. در تبدیل به بازه [0,1) از (double)std::rand() / (RAND_MAX + 1.0) استفاده کنید تا مقدار 1 هرگز حاصل نشود. srand را یک‌بار در ابتدای برنامه فراخوانی کنید و در محیط‌های موازی هر نخ seed مستقل یا از RNG thread-local مانند mt19937 استفاده کنید. با افزایش N نتیجه بهتری برای π خواهیم داشت و خطای نسبی با |approx - M_PI| / M_PI بسنجید.

گزارش

1 پاسخ

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

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