PDA

View Full Version : سوال: تولید عدد تصادفی با توزیع توانی



amidagha
جمعه 13 شهریور 1394, 17:27 عصر
دوستان گرامی با سلام
آیا C++ قابلیت تولید عدد تصادفی با توزیع توانی رو داره؟
اگر نه، راهی هست که بشه با استفاده از اعداد تصادفی تولید شده از توزیع های دیگه مثل یکنواخت، به حالت توانی رسید؟

با سپاس قبلی

حامد مصافی
جمعه 13 شهریور 1394, 17:38 عصر
شما باید توزیع خودتون رو روی بازه منظم اعداد تطبیق بدید.
برای مثال در سیستم‌های رای‌گیری مزنی مثل بانک‌ها کسی که شانس بیشتری برای انتخاب شدن (بواسطه عاملی مانند سپرده بیشتر) داره به تعداد شانس در یک آرایه درج کرده و شخص عادی رو یک بار درج می‌کنند. بدین ترتیب با تولید یک عدد تصادفی به بیشینه طول آرایه می‌توان برنده خوش شانس را به دست آورد. در نتیجه شما همیشه روی بازه منظم سیر می‌کنید و عددی تصادفی از همین بازه را کسب می‌کنید اما می‌توانید با فرمول‌های خاص سناریوی خود آنها را بر نیاز‌های خود تطبیق دهید.
در مثال شما: (اگر درست متوجه شده باشم) کافیه یک عدد رندوم با بیشینه n^2-1 به دست آورده سپس آن را در رادیکال قرار دهید.

rahnema1
جمعه 13 شهریور 1394, 19:35 عصر
سلام
اگه می خواهید توزیع نمایی استفاده کنید جواب بله هست. توزیعهای دیگه هم در ++c وجود داره

#include <chrono>
#include <algorithm>
#include <iostream>
int main()
{
std::exponential_distribution<> distribution(1.0);
std::default_random_engine generator( std::chrono::system_clock::now( ).time_since_epoch( ).count());
for (int i = 0; i < 10; i++)
{
std::cout<< distribution(generator) <<std::endl;
}
}

amidagha
پنج شنبه 26 شهریور 1394, 09:56 صبح
شما باید توزیع خودتون رو روی بازه منظم اعداد تطبیق بدید.
برای مثال در سیستم‌های رای‌گیری مزنی مثل بانک‌ها کسی که شانس بیشتری برای انتخاب شدن (بواسطه عاملی مانند سپرده بیشتر) داره به تعداد شانس در یک آرایه درج کرده و شخص عادی رو یک بار درج می‌کنند. بدین ترتیب با تولید یک عدد تصادفی به بیشینه طول آرایه می‌توان برنده خوش شانس را به دست آورد. در نتیجه شما همیشه روی بازه منظم سیر می‌کنید و عددی تصادفی از همین بازه را کسب می‌کنید اما می‌توانید با فرمول‌های خاص سناریوی خود آنها را بر نیاز‌های خود تطبیق دهید.
در مثال شما: (اگر درست متوجه شده باشم) کافیه یک عدد رندوم با بیشینه n^2-1 به دست آورده سپس آن را در رادیکال قرار دهید.



من دقیقا متوجه منظور شما نشدم، علت اینکه چرا باید یک عدد با بیشینه همراه باشه و بعد زیر رادیکال برده بشه؛ میشه خواهش کنم کمی بیشتر توضیح بدید؟

amidagha
پنج شنبه 26 شهریور 1394, 09:57 صبح
سلام
اگه می خواهید توزیع نمایی استفاده کنید جواب بله هست. توزیعهای دیگه هم در ++c وجود داره

#include <chrono>
#include <algorithm>
#include <iostream>
int main()
{
std::exponential_distribution<> distribution(1.0);
std::default_random_engine generator( std::chrono::system_clock::now( ).time_since_epoch( ).count());
for (int i = 0; i < 10; i++)
{
std::cout<< distribution(generator) <<std::endl;
}
}




توزیع نمایی در این مورد به کارم نمیاد، فقط توزیع توانی لازم دارم :ناراحت:

rahnema1
پنج شنبه 26 شهریور 1394, 14:04 عصر
توزیع نمایی در این مورد به کارم نمیاد، فقط توزیع توانی لازم دارم :ناراحت:

لطفا بگید «توزیع توانی» ترجمه چه عبارت انگلیسیه؟
exponential distribution که اشاره کردید نیست
power law distribution یا ....
اگه نمیدونید لطفا فرمولش را اینجا بذارید