程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> 基於PHP實現假裝商品限時搶購繁忙的效果,商品限時搶購

基於PHP實現假裝商品限時搶購繁忙的效果,商品限時搶購

編輯:關於PHP編程

基於PHP實現假裝商品限時搶購繁忙的效果,商品限時搶購


最近要做一個項目,有關商品顯示搶購的功能。比如我們的網站很帶流量,那麼成千上萬的用戶在幾秒內同時點你的商品,確實會出現“搶購人數過多,會提示,系統繁忙。

    但是呢,大部分網站然而並沒有這麼牛叉。為了讓用戶感受到商品很搶手,動不動就提示”系統繁忙“的效果,我們需要做一個程序來”假裝很繁忙“。 (除了淘寶,大家不要以為其他網站真的很繁忙哦,只不過人家是故意讓你覺得不搶就買不到,求懂)

本文來設定一個規則,大家可以根據我的思路擴展即可。

    1、商品購買鏈接,每個人都可以點。

    2、我們要讓用戶有70%的可能性出現“排隊中,商品繁忙”

    本文用 php代碼實現。其他語言一樣,改改。

首先我們用小學學到的知識想一下:

    1、 如果有10個球,其中3個紅球,7個籃球。放在袋子裡。隨便胡亂的混合一下,讓你用手伸進去摸,那麼摸到籃球的幾率是多少?顯然,是70%

之前我把這個需求給了一個小伙伴看。他給出的答案如下:

     $arr=array(“red”,”red”,”red”,”blue”,”blue”,”blue”,”blue”,”blue”,”blue”,”blue”);

     然後 echo $arr[rand(0,9)];

     然後告訴我,他兩句話就搞定了。

這個做法其實已經蠻聰明了。但是這位小伙伴忽略了很重要的一點

 2、如果第二個人來摸呢? 這裡有個注意點,如果第二個人來摸,那麼必定要把這10個球補滿(依然是3個紅球,7個籃球)

  然後最重要的,還要繼續“胡亂的、隨便的”混合一下。這樣,第二個人來摸到籃球的幾率才會依然是70%.

    上面的程序明顯忽略了:繼續“胡亂的、隨便的”混合一下。 如果每個人都按這個 前三個紅後七個藍 來摸球。那麼php的rand函數不能保證籃球是70%。

    說到這,很多大神要拿出各種高級算法,譬如啥貝葉斯、矩陣之類的字眼出來。如果這麼一個電商功能要用這麼復雜的運算,我相信你的老板不會同意你花這麼多時間來完成這個功能吧。

  接下來,我放出一種簡單,但也不失精准性的算法。我們的目標是:使用php的簡單函數,盡可能的讓摸到籃球的幾率接近於70%。

 第一步: $arr=array(“red”,”red”,”red”,”blue”,”blue”,”blue”,”blue”,”blue”,”blue”,”blue”); 這個東西要有,這就是初始化的三個紅球,7個籃球

 第二步:隨意的、胡亂的混合。

    上面一個數組有10個元素,我們可以采取隨機兩個球交換,交換多少次可以自己定

    先寫個交換函數 (如果這個函數看不懂,就要惡補基礎知識啦)

function swap($i,$j,$arr)
  {
    $tmp=$arr[$i];
    $arr[$i]=$arr[$j];
    $arr[$j]=$tmp;
    return $arr;
  }

    這個函數實現,我輸入兩個隨便什麼序號,實現對這個數組中符合該序號的求交換一下。

 第三步:優化交換算法。

  因為上面的交換函數,輸入的隨機參數導致,紅球和紅球交換,或者籃球和籃球交換。那麼然而並沒有實現“真正的”混合

  所以我們要寫個補充函數,確保每次交換,都必須是紅球和籃球進行隨意交換

 function getRange($arr,$v)
  {
    $ret=array();
    for($i=0;$i<count($arr);$i++)
    {
      if($arr[$i]==$v)
      {
         $ret[]=$i;
      }
    }
     return $ret[rand(0,count($ret)-1)];
  }

   這個函數的作用是:在10個球中找到 紅球或籃球,然後分別取出他們目前所在的序號,然後利用rand函數隨機取一個籃球或者紅球的序號。

   諾看一下這裡:

    $i=getRange($arr,”red”);  //這樣可以取出隨機一個紅球的序號
   $j=getRange($arr,”blue”); //這樣可以取出隨機一個籃球的序號

  第四步:比較重要。

開始隨意的、胡亂的混合

 for($num=0;$num<10;$num++)
     {
       
       $i=getRange($arr,”red”);  
             $j=getRange($arr,”blue”); 
       
       $arr=swap($i,$j,$arr);
      
      // echo implode(“,”, $arr).”|”.$i.”|”.$j.”<br/>”; //這個語句可以看一下輸出,混合過後的排列,是否每次都不一樣
     }

       這裡的注意點是,$num<10  。代表我混合10次。 等於用你的大手到袋子裡胡亂攪10次。 理論上攪的越多,隨機性越強。這裡其實10次足以。

    第四步執行完成後出來的$arr 就是攪拌好的 紅球和籃球的混合體。

 第五步:再次調用 rand函數

      echo $arr[rand(0,9)];

   如果出來的是內容是blue ,則直接exit(“老子很忙,別煩”)
   如果是red,那麼讓程序繼續執行購買程序吧。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved