הוסטס - פורום אחסון האתרים הגדול בישראל

הוסטס - פורום אחסון האתרים הגדול בישראל (https://hosts.co.il/forums/index.php)
-   פורום תיכנות (https://hosts.co.il/forums/forumdisplay.php?f=14)
-   -   השפעה על שליפה בrandom (https://hosts.co.il/forums/showthread.php?t=87530)

link 20-01-11 17:42

השפעה על שליפה בrandom
 
שלום, אני צריך לבנות מערכת באנרים ובמערכת הזו אמור להיות באנרים שיחס הופעה שלהם יותר גבוהה. חשבתי על דרך אחת לביצוע:
לקחת את הרשומות בטבלה, להכפיל את הרשומה לפי היחס שהיא אמורה להופיע(למשל אם באנר צריך להופיע מבחינה סטטיסטית פי עשרה יותר אז אני שם אותו במערך פי עשר יותר משאר הבאנרים) ואז מערבב את המערך החדש ושולף ראנדומלית.

זה נכון לבנות ככה את הפונקציה הזו? אם יש לי מלא באנרים אז יכול להיות שיהיו לי יותר מאלף באנרים(אחרי כל ההכפלות) אז היחס לא משתנה והוא נשאר אותו דבר. אשמח אם תתנו לי תשובה.

Haimz 20-01-11 17:52

שאלה מעניינת, מצטרף

link 20-01-11 22:42

תשובות למישהו?

liorclub 21-01-11 13:24

יש לי רעיון שאולי ת%

link 25-01-11 02:46

לא הבנתי

Ender 25-01-11 07:56

לא משהו שבדקתי,
אבל הנה דרך שחשבתי עליה:
קוד:

$count = 1;
$sql = "SELECT COUNT(`views`) FROM `t_banners`";
$res = mysql_query($sql);
if($row=mysql_fetch_array($res)) { $count = intval($row[0])+1; }

$sql = "SELECT * FROM `t_banners` WHERE ((`rate` * {$count}) > `views`) ORDER BY RAND() LIMIT 1";
$res = mysql_query($sql);
if($row=mysql_fetch_assoc($res))
{
// show banner code here

$sql = "UPDATE `t_banners` SET `views` = `views` + 1 WHERE `id` = '{$row["id"]}'";
mysql_query($sql);
}

בהנחה שבטבלה t_banners יש שדה בשם rate שהוא אחוז ההופעות (למשל: 0.4), ושדה views שהוא כמות הצפיות בפועל
1. מחשבים את כמות הצפיות הכללית שהיתה עד עכשיו + 1 ומכניסים למשתנה $count
2. שולפים באנר אקראי בו אחוז החשיפה כפול מספר הצפיות הטוטאלי גדול ממספר הצפיות בפועל של הבאנר

אחוז החשיפה כפול מספר הצפיות הטוטאלי זה כמה פעמים הבאנר היה אמור להיות מוצג, אז אם המספר הזה גדול ממספר הצפיות בפועל, צריך להציג אותו.

נגיד יש 2 באנרים,
אחד עם אחוז של 0.4 ו- 4 צפיות
ואחד עם אחוז של 0.6 ו- 5 צפיות.
סך הצפיות הטוטאלי (9) + אחד יהיה 10.

הראשון לא יוצג כי 0.4 * 10 שווה ל- 4.
השני כן יוצג כי 0.6 * 10 גדול מ- 5.

מקווה שזה ברור ושזה יעזור :)

link 25-01-11 11:08

האמת היא, שכבר פתרתי את זה ושכחתי להודיע. אתה עשית את זה בלי לולאה חיצונית או משהו, לעומתי שעשיתי את זה עם מה שהצעתי בהתחלת הנושא.
אבל נחמד מאוד ותודה רבה על ההענות.

BlueNosE 25-01-11 16:24

ציטוט:

נכתב במקור על ידי link (פרסם 793882)
האמת היא, שכבר פתרתי את זה ושכחתי להודיע. אתה עשית את זה בלי לולאה חיצונית או משהו, לעומתי שעשיתי את זה עם מה שהצעתי בהתחלת הנושא.
אבל נחמד מאוד ותודה רבה על ההענות.

כשרשמת את זה חשבתי אולי על לעשות את זה עם ORDER BY ולהשתמש בIFים בשאילתא. גם הדרך שלך עובדת אבל נראה לי שאפשר לייעל.. בכל מקרה, שיהיה בהצלחה

link 25-01-11 17:03

סתם בשביל הספורט, אני אפרסם את שלי:

PHP קוד:

    $banners = array();
    
$hotspot->sql->query("SELECT script,ratio,id FROM bnners");

    while ( 
$r $hotspot->sql->fetch_row() )
    {
        
$banners[] = array($r[0],$r[1],$r[2]);
    }

        
$final_banners = array();

        foreach ( 
$banners as $k => $v )
        {
            
$times $v[1]*($hotspot->sql->num_row()-1);
            for ( 
$i 0$i <= $times;$i++)
            {
                
$final_banners[] = array($v[0],$v[2]);
            }
        }

        
shuffle($final_banners);

        
$chosen rand(1count($final_banners));

echo
$final_banners[$chosen][0]; 


idok 27-01-11 20:04

אוקי הרעיון שלי הוא כחה נגיד אתה רוצה יחס של 1 ל10 פשוט תסים במסד נתונים 10 פעמים את באנר מסםפר אחד ופעם אחת את מספר 2 ואז יהיה לך יחס של אחד ל10


כל הזמנים הם GMT +2. הזמן כעת הוא 08:43.

מופעל באמצעות VBulletin גרסה 3.8.6
כל הזכויות שמורות ©
כל הזכויות שמורות לסולל יבוא ורשתות (1997) בע"מ