PDA

View Full Version : سوال: بالا بردن احتمال یک انتخاب



p30graph3
دوشنبه 03 خرداد 1389, 18:05 عصر
سلام من برنامه ای نوشتم که در اون کاربران امتیاز دارن.

برای مصرف امتیاز ها الان سیستم طوری هست که کاربرانی که امتیاز در حسابشون هست رو به صورت تصادفی انتخب میکنه

ولی من من میخوام کاری کنم که کسانی که امتیاز بیشتری دارن احتمال انتخاب شدنشونبیشتر باشه.

کوئری من اینه اخرش

order by rand () limit 1

من این کار هم کردم

order by points desc limit 1

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

لطفا راهنماییم کنید

p30graph3
سه شنبه 04 خرداد 1389, 14:22 عصر
کسی نیست؟ جواب منو بده؟

trade_mark
سه شنبه 04 خرداد 1389, 14:59 عصر
کسی نیست؟ جواب منو بده؟
اگه فقط می خوای با کوئری زدن این کار رو انجام بدی باید بگم دستور اماده ای وجود نداره.خودت باید این کار رو انجام بدی.یعنی یه الگوریتم بنویسی

p30graph3
سه شنبه 04 خرداد 1389, 20:35 عصر
خوب منم دنبال همین الگوریتمم!

xoogle.ir
سه شنبه 04 خرداد 1389, 21:42 عصر
فکر کنم با این الگوریتم بتونی کارت رو راه بندازی :

1- امتیاز کاربری که بیشترین امتیاز رو داره به دست بیار مثلا میشه 120 و بریش مثلا توی $max حالا یه عدد دیگه بساز این جوری :


$number=$max/2;

2- بعد بیا یه بار تابع رندوم php رو بین اعداد 1 تا 10 اجرا کن و حاصل رو بریز توی یک متغیر.


$random_number=rand(1, 10);

3- بعد بیا چک کن که اگر این عدد تولید شده بین 1 تا 8 بود (احتمال 80 درصد) این query رو اجرا کن.


mysql_query("select * from tablename where points>$number order by rand() limit 1")


این کد یکی از افرادی که امتیازشون بیشتر از نصف امتیاز بالاترین کاربر هست رو انتخاب میکنه.
4- بعد چک کن که اگر عدد تولید شده بین 1 تا 8 نبود (احتمال 20 درصد) این query انجام بشه :


mysql_query("select * from tablename where points<$number order by rand() limit 1")

امیدوارم کمکت کنه :لبخندساده:

mirmousavi.m
سه شنبه 04 خرداد 1389, 23:23 عصر
الگوریتم نمی‌خاد، یه چیزی براش تو php هست... تو خود ()rand، ولی من یادم نیست، گوگل کن!

pashaie
چهارشنبه 05 خرداد 1389, 09:22 صبح
یه جدول جدید بساز به نام مثلا tickets که دوتا فیلد داره id و id_جدول اصلیت
برای دفعه اول یه حلقه بنویس که تمام رکورد های جدول رو بخونه و به ازای هر واحد (واحدات می تونه 1 یا 5 یا 100 امتیازی باشه ) امتیاز یه رکورد به جدول جدید اضافه کنه.
بعد از این، هرجایی که قراره تو جدول اصلیت رکوردی اضافه بشه یا امتیازش تغییر کنه، جدول جدید هم باید متناسب با تغییر جدید تغییر کنه.
در آخر هم با استفاده از کوری زیر به جواب می رسی



SELECT y.* FROM yourtable y
LEFT JOIN tickets t ON t.id_yourtable = y.id
ORDER BY Rand() limit 1

p30graph3
چهارشنبه 05 خرداد 1389, 17:50 عصر
ممنون دوستان . جواب هاتون هر دو خوب بود horap30 و pashaie

ولی برای کار من جواب horap30 بهتر هست. و جواب pashaie هم با اینکه خیلی خوب بود تستش که کردم ولی برای پروژه من زیادی خوب بود!

در هر صورت مشکلم رفع شد. بازم ممنون