很多做電商開發的小夥伴會遇到這個需求。
譬如我們要做一個 商品限時秒殺的功能。 其實如果你的網站很有流量,那麼很多使用者在幾秒内同時點你的商品,确實會出現“搶購人數太多,請排隊”。
但是呢,大部分網站然而并沒有這麼牛叉。為了讓使用者感受到商品很搶手,動不動就提示”系統繁忙“的效果,我們需要做一個程式來”假裝很繁忙“。 (除了淘寶,大家不要以為其他網站真的很繁忙哦,隻不過人家是故意讓你覺得不搶就買不到,求懂)
本文來設定一個規則,大家可以根據我的思路擴充即可。
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,那麼讓程式繼續執行購買程式吧。
這個大家自己編寫吧。
————————————————–
【你如果不愛讀書、不愛看新聞、不愛學習,沒關系。我來做你的”陪讀郎”】
奴隸我的方式:請關注微信訂閱号:程式員在囧途。
講故事、講商業模式、講技術給你聽。
<a href="http://s3.51cto.com/wyfs02/M01/6E/57/wKioL1V5xrqSysBDAAETs1-hPPM856.jpg" target="_blank"></a>
本文轉自shenyisyn51CTO部落格,原文連結: http://blog.51cto.com/shenyisyn/1703454,如需轉載請自行聯系原作者