최근에는 급매 상품 진열 기능에 관한 프로젝트를 진행하고 있습니다. 예를 들어, 당사 웹사이트의 트래픽이 많고 몇 초 안에 수천 명의 사용자가 귀하의 제품을 동시에 클릭하면 "너무 많은 사람들이 구매를 서두르고 있습니다"라는 메시지가 나타나고 시스템이 바빠집니다. 🎜>
하지만 대부분의 웹사이트는 그다지 훌륭하지 않습니다. 사용자가 제품이 매우 인기가 있고 "시스템 사용 중" 효과가 항상 표시되도록 하려면 "바쁜 척"하는 프로그램을 만들어야 합니다. (타오바오를 제외한 다른 사이트는 너무 바쁘다고 생각하지 마세요. 일부러 잡지 않고는 살 수 없다는 느낌을 주게 하는 것일 뿐입니다. 이해해 주세요)본 글은 규칙을 정한 것이며, 제 생각에 따라 확장하셔도 됩니다.
1. 누구나 제품 구매 링크를 클릭할 수 있습니다.
이 글은 PHP 코드를 사용하여 구현되었습니다. 다른 언어와 동일하게 변경하세요.
우선 초등학교 때 배운 지식을 활용해 생각해 보겠습니다.
1. 공이 10개 있다면 빨간 공은 3개, 농구공은 7개입니다. 가방에 넣으세요. 무작위로 섞어서 손을 넣어서 만져보게 하면 농구공이 닿을 확률은 얼마나 될까요? 아무래도 70%인 것 같아요
이번에 친구에게 이 요구사항을 보여줬어요. 그가 내린 대답은 이렇습니다.
$arr=array("빨간색","빨간색","빨간색","파란색","파란색","파란색","파란색","파란색","파란색","파란색");
이 접근 방식은 실제로 매우 현명합니다. 그런데 이 작은 친구는 아주 중요한 점을 무시했습니다
2. 두 번째 사람이 만지면 어떻게 되나요? 여기서 한 가지 주의할 점은 두 번째 사람이 터치하게 되면 이 10개의 공을 채워야 한다는 것입니다(여전히 빨간 공 3개, 농구공 7개)
그리고 가장 중요한 것은 "무작위로, 부담없이" 계속해서 섞는 것입니다. 이런 식으로 두 번째 사람이 농구공을 만질 확률은 여전히 70%가 됩니다.
위의 절차는 분명히 무시합니다. 계속해서 "무작위로" 혼합합니다. 모두가 처음 세 개의 빨간색과 마지막 일곱 개의 파란색을 눌러 공을 터치하면 됩니다. 그러면 PHP의 rand 함수는 농구공이 70%임을 보장할 수 없습니다.
이렇게 말하면 많은 마스터들이 베이지안, 행렬 및 기타 단어와 같은 다양한 고급 알고리즘을 고안하고 싶어합니다. 그러한 전자 상거래 기능에 그렇게 복잡한 계산이 필요한 경우, 귀하의 상사는 귀하가 이 기능을 완료하는 데 너무 많은 시간을 소비하는 것에 동의하지 않을 것이라고 믿습니다.
다음으로 간단하면서도 정확한 알고리즘을 공개합니다. 우리의 목표는 PHP의 간단한 함수를 사용하여 농구공에 닿을 확률을 가능한 한 70%에 가깝게 만드는 것입니다.
1단계: $arr=array("red","red","red","blue","blue","blue","blue","blue", " blue","blue"); 이것이 있어야 합니다. 이것은 초기화된 빨간 공 3개와 농구공 7개입니다
2단계: 무작위로 혼합합니다.
function swap($i,$j,$arr) { $tmp=$arr[$i]; $arr[$i]=$arr[$j]; $arr[$j]=$tmp; return $arr; }
3단계: 교환 알고리즘을 최적화합니다.
위의 교환 함수와 입력된 랜덤 매개변수로 인해 빨간 공이 빨간 공으로 교환되거나, 농구공이 농구공으로 교환됩니다. 그러나 "진짜" 믹싱은 이루어지지 않습니다따라서 모든 교환이 빨간 공과 농구공의 무작위 교환이 되도록 보장하는 보충 기능을 작성해야 합니다.
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)]; }
여기를 살펴보세요:
$j=getRange($arr,”blue”); //임의의 농구공 일련번호를 알아낼 수 있습니다
4단계: 더 중요합니다.
무작위로 혼합 시작
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번이면 충분합니다.
4단계가 완료된 후 나오는 $arr는 빨간 공과 농구공이 혼합된 형태입니다.
5단계: rand 함수 다시 호출
에코 $arr[rand(0,9)];
내용이 파란색이면 바로 나가세요("바빠요. 귀찮게 하지 마세요")
빨간색이면 프로그램이 구매 프로세스를 계속 실행하도록 합니다.