PDA

View Full Version : گفتگو: روش انتخاب یک عدد تصادفی در عادلانه ترین حالت



mehran2000_544
دوشنبه 23 شهریور 1388, 23:04 عصر
با سلام.
فرض کنید لیستی از اعداد تکراری داریم و می خواهیم یک عدد را به تصادف انتخاب کنیم به نحوی که عددی که بیشتر از همه تکرار شده، بیشترین شانس انتخاب شدن و عددی که کمتر از همه تکرار شده، کمترین شانس انتخاب شدن را داشته باشه.
راه حلی که خودم در نظر دارم اینه که لیست اعداد را ابتدا Sort کنیم و سپس در هم Merge کنیم به نحوی که کاملاً به هم ریخته شود و سپس از تابع Random Generator عددی تصادفی را بگیریم و به تعداد همان عدد تصادفی، لیست در هم ریخته را پیمایش کنیم.
در این صورت عددی که حاصل می شود، در عادلانه ترین حالت ممکن به پیروزی رسیده است.
من این برنامه را برای سیستم قرعه کشی یک فروشگاه می خوام بنویسم به نحوی که افرادی که بیشترین مبلغ خرید را در ماه داشته اند، بیشترین شانس برنده شدن جایزه را داشته باشند.

به نظر شما این راه حل مناسب است؟
اگر نیست، چه راه حلی پیشنهاد می کنید.
اگر هست، چه راه حلی را برای در هم ریختن لیست با بهترین کیفیت پیشنهاد می کنید؟

با سپاس...

tdkhakpur
سه شنبه 24 شهریور 1388, 00:21 صبح
راه حلی که خودم در نظر دارم اینه که لیست اعداد را ابتدا Sort کنیم و سپس در هم Merge کنیم به نحوی که کاملاً به هم ریخته شود و سپس از تابع Random Generator عددی تصادفی را بگیریم و به تعداد همان عدد تصادفی، لیست در هم ریخته را پیمایش کنیم.
خوب همین کار شما میتواند عدالت را تصادفی کند و به افرادی که بیشترین خرید را داشته باشند شانس مساوی با سایرین بدهد.
بهترین راه این است که شما از افراد درصد بگیرید یعنی از کل خریدها چه کسانی و چه درصدی را شامل شده اند. سپس میتوانید random را با درصد افراد بگیرید یعنی به فرض


x = 10 خرید
y = 14 خرید
z = 45 خرید
x+y+z = 69
در این صورت
x = 15%
y = 20%
z = 65%

برای رده های افراد فوق random بگیرید یعنی برای ارائه عدد تصادفی شانسی, برای خریداران با درصد اول 15 بار و برای خریداران با درصد دوم 20 بار و برای خریداران درصد سوم 65 بار این شانس را امتحان کنید. البته شروع را با درصد بالا شروع کنید.
این نظر شخصی بنده است الگوریتمهای زیادی را میتوان پیشنهاد داد.

mehran2000_544
سه شنبه 24 شهریور 1388, 11:16 صبح
با راه حل من،اگر فرض کنید به ازای هر 5000 تومان خرید، در هر روز یک مرتبه کد مشتری در لیست قرعه کشی ثبت شود، کد مشتریانی که بیشترین خرید را داشته اند، بیشترین تکرار را خواهد داشت.
در این صورت حتی با به هم خوردن لیست نیز احتمال پیروزی برای آنها بیشتر از سایرین است (البته من اینطور فکر می کنم)



... بهترین راه این است که شما از افراد درصد بگیرید یعنی از کل خریدها چه کسانی و چه درصدی را شامل شده اند. سپس میتوانید random را با درصد افراد بگیرید ...



راه حل جنابعالی هم جالب است اما برای سیستم این فروشگاه و با توجه به تعداد زیاد مشتری در هر ماه،به نظر می رسد پیچیدگی بالایی هم در زمان و هم در پیاده سازی دارد.