1. PHP / Говнокод #16722

    +158

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    $rand = rand(1,100);
    if (($rand => 1) && ($rand <= 50)) {
    include 'код баннера 1';
    }
    elseif (($rand => 51) && ($rand <= 80)) {
    include 'код баннера 2';
    }
    else {
    include 'код баннера 3';
    }
    
    50% - баннер 1, 30% - баннер 2, остальное (20%) - баннер 3.

    Хотели сделать "ротацию с весом" для X баннеров :)

    Запостил: SVP, 18 Сентября 2014

    Комментарии (10) RSS

    • Дайте и мне поговнокодить, что ли...
      $banners = array( 
          'banner1' => 50, // %
          'banner2' => 30, 
          'banner3' => 20, 
      );
      $result = array();
      foreach ( $banners as $k=>$v ) {
          $result = array_merge( $result, array_fill( 0, $v, $k ) );
      }
      shuffle($result);
      include $result[0];
      Ответить
      • И что характерно, у ОПа меньшее из говн.
        Ответить
    • include '/path/to/banner/' . [
      'banner1.php',
      'banner2.php',
      'banner3.php',
      ][
      ($rand < 20) +
      ($rand < 50) + // 30 + 20
      ($rand < 100) // 30 + 20 + 50
      - 1];
      Ответить
      • $rand = mt_rand(0, 99);

        include '/path/to/banner/' . [
        'banner1.php',
        'banner2.php',
        'banner3.php',
        ][
        ($rand < 20) +
        ($rand < 50) // 30 + 20
        // всегда < 100
        ];
        Ответить
        • Вот это по-нашему!
          Ответить
          • Энтерпрайзненькое решение:
            function weighted_choose($variants) {
                $n = mt_rand(0, array_sum($variants) - 1);
                foreach ($variants as $key => $value) {
                    if (($n -= $value) < 0)
                        return $key;
                }
            }
            http://ideone.com/VYE5vo
            Ответить
            • Какой Энетерпрайз без NoSQL?
              Ответить
              • без оракла же
                Ответить
                • согласен.
                  Ответить
                • Хорошо, вот вам энтерпрайз (к сожалению синий слоник, не оракл):
                  select q.name from (select name, weight, sum(weight) over (rows between
                  unbounded preceding and current row) as s from test) q where q.s>(select
                  floor((select sum(weight) from test) * random()))  order by s limit 1;
                  http://sqlfiddle.com/#!15/e85d4/3
                  Ответить

    Добавить комментарий