當前位置:首頁 » 網頁前端 » 前端抽獎演算法
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

前端抽獎演算法

發布時間: 2022-11-05 22:46:31

『壹』 JAVA抽獎的演算法

優先順序規則使高等獎盡量在後期抽出

importjava.util.LinkedList;
importjava.util.List;

publicclassGetGift{

//獎品倉庫
privateList<Gift>gifts=newLinkedList<Gift>();

publicGetGift(){
//生成一堆獎品放進獎品倉庫
//一等獎一個優先順序1,二等獎兩個優先順序2。。。20等獎20個優先順序20
for(inti=1;i<=20;i++){
GiftTypegt=newGiftType(i+"等獎",i,i);
for(intj=1;j<=i;j++){
gifts.add(newGift(i+"等獎——第"+j+"號",gt));
}
}
}

//抽獎
publicsynchronizedGiftgetGift(){
intrandomNumber=(int)(Math.random()*total());
intpriority=0;
for(Giftg:gifts){
priority+=g.getType().getPriority();
if(priority>=randomNumber){
//從獎品庫移出獎品
gifts.remove(g);
returng;
}
}
//抽獎次數多於獎品時,沒有獎品
returnnull;
}

/**
*@paramargs
*/
publicstaticvoidmain(String[]args){
GetGiftgg=newGetGift();
//一共生成210個獎品,抽210次,多抽顯示null
for(inti=0;i<210;i++){
System.out.println(gg.getGift());
}
}

//計算總優先順序,內部使用
privateinttotal(){
intresult=0;
for(Giftg:gifts){
result+=g.getType().getPriority();
}
returnresult;
}
}

//記錄獎品的信息
//如1等獎共1個,優先順序為1最難抽
classGiftType{
//名字(如1等獎)
privateStringname;
//這種獎品的數量,數量越大越容易抽到
privateintquantity;
//這種獎品的優先順序,最小為1,數越大越容易抽到
privateintpriority;

publicGiftType(Stringname,intquantity,intpriority){
this.name=name;
this.quantity=quantity;
this.priority=priority;
}

publicintgetPriority(){
returnpriority;
}

@Override
publicStringtoString(){
return"GiftType[name="+name+",quantity="+quantity+",priority="+priority+"]";
}

}

//獎品
classGift{
//每個獎品有唯一id,抽獎不會重復,格式為"16等獎——第8號"
privateStringid;
//這個獎品的類別
privateGiftTypetype;

publicGift(Stringid,GiftTypetype){
this.id=id;
this.type=type;
}

publicGiftTypegetType(){
returntype;
}

@Override
publicStringtoString(){
return"Gift[id="+id+",type="+type+"]";
}

}

『貳』 翻板抽獎怎麼做

在電視節目中有一種抽獎形式暫且叫做翻板抽獎,台上有一個牆面,牆面放置幾個大方塊,主持人或者抽獎者翻開對應的方塊即可揭曉中獎結果。類似的抽獎形式還可以應用在WEB中,本文將使用PHP+jQuery為您講解如何實現翻板抽獎程序。

查看演示DEMO
翻板抽獎的實現流程:前端頁面提供6個方塊,用數字1-6依次表示6個不同的方塊,當抽獎者點擊6個方塊中的某一塊時,方塊翻轉到背面,顯示抽獎中獎信息。看似簡單的一個操作過程,卻包含著WEB技術的很多知識面,所以本文的讀者應該熟練掌握jQuery和PHP相關知識。
HTML
與本站上篇文章使用jQuery+PHP+Mysql實現抽獎程序不同的是,翻板抽獎不提供開始和結束抽獎按鈕,抽獎者自己決定選取其中的某一個方塊,來完成抽獎的,所以我們在頁面中放置6個方塊,並且用1-6來表示不同的方塊。

<ul id="prize">
<li class="red" title="點擊抽獎">1</li>
<li class="green" title="點擊抽獎">2</li>
<li class="blue" title="點擊抽獎">3</li>
<li class="purple" title="點擊抽獎">4</li>
<li class="olive" title="點擊抽獎">5</li>
<li class="brown" title="點擊抽獎">6</li>
</ul>
<div><a href="#" id="viewother">【翻開其他】</a></div>
<div id="data"></div>

html結構中,我們使用一個無序列表放置6個不同的方塊,每個li中的clas屬性表示該方塊的顏色,列表下面是一個鏈接a#viewother,用來完成抽獎後,點擊它,翻看其他方塊背面的中獎信息,默認是隱藏的。接下來還有一個div#data,它是空的,作用是用來臨時存儲未抽中的其他獎項數據,具體情況看後面的代碼。為了讓6個方塊並排看起來舒服點,您還需要用CSS來美化下,具體可參照demo,本文中不再貼出css代碼。
PHP
我們先完成後台PHP的流程,PHP的主要工作是負責配置獎項及對應的中獎概率,當前端頁面點擊翻動某個方塊時會想後台PHP發送ajax請求,那麼後台PHP根據配置的概率,通過概率演算法給出中獎結果,同時將未中獎的獎項信息一並以JSON數據格式發送給前端頁面。
先來看概率計算函數

function get_rand($proArr) {
$result = '';

//概率數組的總概率精度
$proSum = array_sum($proArr);

//概率數組循環
foreach ($proArr as $key => $proCur) {
$randNum = mt_rand(1, $proSum);
if ($randNum <= $proCur) {
$result = $key;
break;
} else {
$proSum -= $proCur;
}
}
unset ($proArr);

return $result;
}

上述代碼是一段經典的概率演算法,$proArr是一個預先設置的數組,假設數組為:array(100,200,300,400),開始是從1,1000這個概率范圍內篩選第一個數是否在他的出現概率范圍之內, 如果不在,則將概率空間,也就是k的值減去剛剛的那個數字的概率空間,在本例當中就是減去100,也就是說第二個數是在1,900這個范圍內篩選的。這樣篩選到最終,總會有一個數滿足要求。就相當於去一個箱子里摸東西,第一個不是,第二個不是,第三個還不是,那最後一個一定是。這個演算法簡單,而且效率非常高,關鍵是這個演算法已在我們以前的項目中有應用,尤其是大數據量的項目中效率非常棒。
接下來我們通過PHP配置獎項。

$prize_arr = array(
'0' => array('id'=>1,'prize'=>'平板電腦','v'=>1),
'1' => array('id'=>2,'prize'=>'數碼相機','v'=>5),
'2' => array('id'=>3,'prize'=>'音箱設備','v'=>10),
'3' => array('id'=>4,'prize'=>'4G優盤','v'=>12),
'4' => array('id'=>5,'prize'=>'10Q幣','v'=>22),
'5' => array('id'=>6,'prize'=>'下次沒准就能中哦','v'=>50),
);

中是一個二維數組,記錄了所有本次抽獎的獎項信息,其中id表示中獎等級,prize表示獎品,v表示中獎概率。注意其中的v必須為整數,你可以將對應的獎項的v設置成0,即意味著該獎項抽中的幾率是0,數組中v的總和(基數),基數越大越能體現概率的准確性。本例中v的總和為100,那麼平板電腦對應的中獎概率就是1%,如果v的總和是10000,那中獎概率就是萬分之一了。
每次前端頁面的請求,PHP循環獎項設置數組,通過概率計算函數get_rand獲取抽中的獎項id。將中獎獎品保存在數組$res['yes']中,而剩下的未中獎的信息保存在$res['no']中,最後輸出json個數數據給前端頁面。

foreach ($prize_arr as $key => $val) {
$arr[$val['id']] = $val['v'];
}

$rid = get_rand($arr); //根據概率獲取獎項id

$res['yes'] = $prize_arr[$rid-1]['prize']; //中獎項
unset($prize_arr[$rid-1]); //將中獎項從數組中剔除,剩下未中獎項
shuffle($prize_arr); //打亂數組順序
for($i=0;$i<count($prize_arr);$i++){
$pr[] = $prize_arr[$i]['prize'];
}
$res['no'] = $pr;
echo json_encode($res);

直接輸出中獎信息就得了,為何還要把未中獎的信息也要輸出給前端頁面呢?請看後面的前端代碼。
jQuery
首先為了實現翻板效果,我們需要預先載入翻動插件及jquery,jqueryui相關插件:

<script type="text/javascript" src="js/jquery-1.7.2.min.js"></script>
<script type="text/javascript" src="js/jquery-ui-1.7.2.custom.min.js"></script>
<script type="text/javascript" src="js/jquery.flip.min.js"></script>

關於flip插件您可以到其官網:http://lab.smashup.it/flip/了解更多信息。
接下來,我們通過單擊頁面中的方塊,來完成抽獎行為。

$(function(){
$("#prize li").each(function(){
var p = $(this);
var c = $(this).attr('class');
p.css("background-color",c);
p.click(function(){
$("#prize li").unbind('click');
$.getJSON("data.php",function(json){
var prize = json.yes; //抽中的獎項
p.flip({
direction:'rl', //翻動的方向rl:right to left
content:prize, //翻轉後顯示的內容即獎品
color:c, //背景色
onEnd: function(){ //翻轉結束
p.css({"font-size":"22px","line-height":"100px"});
p.attr("id","r"); //標記中獎方塊的id
$("#viewother").show(); //顯示查看其他按鈕
$("#prize li").unbind('click')
.css("cursor","default").removeAttr("title");
}
});
$("#data").data("nolist",json.no); //保存未中獎信息
});
});
});
});

代碼中先遍歷6個方塊,給每個方塊初始化不同的背景顏色,單擊當前方塊後,使用$.getJSON向後台data.php發送ajax請求,請求成功後,調用flip插件實現翻轉方塊,在獲取的中獎信息顯示在翻轉後的方塊上,翻轉結束後,標記該中獎方塊id,同時凍結方塊上的單擊事件,即unbind('click'),目的就是讓抽獎者只能抽一次,抽完後每個方塊不能再翻動了。最後將未抽中的獎項信息通過data()儲存在#data中。
其實到這一步抽獎工作已經完成,為了能查看其他方塊背面究竟隱藏著什麼,我們在抽獎後給出一個可以查看其他方塊背面的鏈接。通過點擊該鏈接,其他5個方塊轉動,將背面獎項信息顯示出來。

$(function(){
$("#viewother").click(function(){
var mydata = $("#data").data("nolist"); //獲取數據
var mydata2 = eval(mydata);//通過eval()函數可以將JSON轉換成數組

$("#prize li").not($('#r')[0]).each(function(index){
var pr = $(this);
pr.flip({
direction:'bt',
color:'lightgrey',
content:mydata2[index], //獎品信息(未抽中)
onEnd:function(){
pr.css({"font-size":"22px","line-height":"100px","color":"#333"});
$("#viewother").hide();
}
});
});
$("#data").removeData("nolist");
});
});

當單擊#viewother時,獲取抽獎時保存的未抽中的獎項數據,並將其轉化為數組,翻轉5個方塊,將獎品信息顯示在對應的方塊中。最終效果圖:

為什麼我抽不到大獎?
在很多類似的抽獎活動中,參與者往往抽不到大獎,筆者從程序的角度舉個例給你看,假如我是抽獎活動的主辦方,我設置了6個獎項,每個獎項不同的中獎概率,假如一等獎是一台高級轎車,可是我設置了其中獎概率為0,這意味著什麼?這意味著參與抽獎者無論怎麼抽,永遠也得不到這台高級轎車。而當主辦方每次翻動剩下的方塊時,參與者會發現一等獎也許就在剛剛抽獎的方塊旁邊的一個數字下,都怪自己運氣差。真的是運氣差嗎?其實在參與者翻動那個方塊時程序已經決定了中獎項,而翻動查看其他方塊看到的獎項只是一個煙霧彈,迷惑了觀眾和參與者。我想看完這篇文章後,您或許會知道電視節目中的翻板抽獎貓膩了,您也許大概再不會去機選雙色球了。
BUG修復:感謝熱心網友寒川和Tears反饋的關於可以連續翻動的bug,解決辦法,在單擊事件後,ajax前限制click事件插入代碼:

$("#prize li").unbind('click');

『叄』 java抽獎程序,可設置不同獎品獲得概率

importjava.awt.EventQueue;
importjava.awt.TextArea;
importjava.awt.TextField;
importjava.awt.event.ActionEvent;
importjava.awt.event.ActionListener;
importjava.util.Random;

importjavax.swing.JButton;
importjavax.swing.JFrame;
importjavax.swing.JLabel;
importjavax.swing.JPanel;
importjavax.swing.JTextArea;
importjavax.swing.JTextField;
importjavax.swing.border.EmptyBorder;


{

privateJPanelcontentPane;
privateJTextFieldtextFieldA;
privateJTextFieldtextFieldB;
privateJTextFieldtextFieldC;
privateTextFieldtextField;
;
privateJTextAreatextArea;
/**
*Launchtheapplication.
*/
publicstaticvoidmain(String[]args){
EventQueue.invokeLater(newRunnable(){
publicvoidrun(){
try{
LuckySelectframe=newLuckySelect();
frame.setVisible(true);
}catch(Exceptione){
e.printStackTrace();
}
}
});
}

/**
*Createtheframe.
*/
publicLuckySelect(){
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100,100,450,251);
contentPane=newJPanel();
contentPane.setBorder(newEmptyBorder(5,5,5,5));
contentPane.setLayout(null);
setContentPane(contentPane);

JLabellblA=newJLabel("A");
lblA.setBounds(10,128,54,15);
contentPane.add(lblA);

JLabellblB=newJLabel("B");
lblB.setBounds(124,128,54,15);
contentPane.add(lblB);

JLabellblC=newJLabel("C");
lblC.setBounds(254,128,54,15);
contentPane.add(lblC);

textFieldA=newJTextField();
textFieldA.setBounds(30,125,66,21);
contentPane.add(textFieldA);
textFieldA.setColumns(10);

textFieldB=newJTextField();
textFieldB.setColumns(10);
textFieldB.setBounds(149,125,66,21);
contentPane.add(textFieldB);

textFieldC=newJTextField();
textFieldC.setColumns(10);
textFieldC.setBounds(264,125,66,21);
contentPane.add(textFieldC);

textField=newTextField();
textField.setBounds(98,167,157,21);
contentPane.add(textField);
textField.setColumns(10);

textFieldResult=newJTextField();
textFieldResult.setBounds(280,167,66,21);
contentPane.add(textFieldResult);
textFieldResult.setColumns(10);
textFieldA.setText("10");
textFieldB.setText("10");
textFieldC.setText("10");

JButtonbutton=newJButton("u62BDu5956");
button.addActionListener(newActionListener(){
publicvoidactionPerformed(ActionEvente){
select();
}
});
button.setBounds(0,166,93,23);
contentPane.add(button);

textArea=newJTextArea();
textArea.setBounds(30,31,306,83);
contentPane.add(textArea);
}

protectedvoidselect(){
//TODOAuto-generatedmethodstub
intaNum=Integer.decode(textFieldA.getText());
intbNum=Integer.decode(textFieldB.getText());
intcNum=Integer.decode(textFieldB.getText());
Randomr=newRandom();
intrandom=r.nextInt(aNum+bNum+cNum);
if(random<=aNum){
textFieldA.setText(Integer.toString(Integer.decode(textFieldA.getText())-1));
textArea.append(Integer.toString(random)+"抽中了A ");
}elseif(random<=aNum+bNum){
textFieldB.setText(Integer.toString(Integer.decode(textFieldB.getText())-1));
textArea.append(Integer.toString(random)+"抽中了B ");
}elseif(random<=aNum+bNum+cNum){
textFieldC.setText(Integer.toString(Integer.decode(textFieldC.getText())-1));
textArea.append(Integer.toString(random)+"抽中了C ");
}

}
}

『肆』 怎樣根據物品價值制定抽獎概率

抽獎概率-三種演算法一、逢「幾」中獎逢「幾」中獎,即通過預估抽獎人數和獎品數來判斷,「幾」=(抽獎人數/獎品數)*N。這是一種最簡單抽獎演算法,適合抽獎人數眾多,而且互相無聯系的情況。如今大為流行的微博轉發得獎就常常使用這種演算法,即根據轉發次數來決定獎品歸屬,透明而且具有激勵性。當然這個「幾」也不單只次數,還可能是時間,逢某個時間點就可以抽中,不過這種方案可能產生無人中獎和很多人中獎的情況,時間點的安排很關鍵!這個時間點一旦公布出去,那就是秒殺,霍霍。。逢「幾」中獎有很多弊端,但是非常簡單,很容易實現,被很多抽獎活動所採用,有些會公布抽獎規則,激勵抽獎,有些則不會公布,其實後台運行的可能也是這個演算法,簡單高效又不失公平。在信息不透明的情況下,鬼知道你是第幾個抽獎的,哈哈。。二、概率抽獎所謂概率抽獎是最容易想到的抽獎演算法了,這個概率可以是一成不變的,也可以是一直在變化調整的,最難的是採用多大的概率,何種情況下採用何種概率。這個也沒有什麼通用的方案,不同的應用場景,所用的概率演算法不同。下面介紹一種演算法,根據獎品的過期日期來計算它當前時間的中獎率,當時間逐漸接近獎品過期時間時,中獎概率會逐漸發生變化,如果設為1表示線性衰減,2為平方衰減,以此類推。

『伍』 求教高手,初學javaweb,有一個關於抽獎後台程序的疑惑

既然你都已經可以在JSP頁面實現功能了,那要放到servlet中去實現應該是很簡單的吧,無非就是把JSP頁面中處理邏輯的代碼搬到一個servlet裡面並且把表單參數的傳遞指向servlet,在從JSP頁面接受servlet處理後返回的結果。

『陸』 c# 如何實現抽獎轉盤演算法

每次抽的時候分配一個唯一的號碼,就不可能同時抽到一個獎了呀,
所謂的轉盤只不過是一個動畫效果的障眼法而已,這樣的實現就不難了哈

『柒』 js寫抽獎轉盤怎麼設置中獎幾率

js用向後端發送請求,然後後端通過一些演算法計算出要中的獎項或者旋轉的角度,返回到前端,js根據返回的獎項或者旋轉的角度,來決定最終停止的位置。

中獎幾率基本不寫在js里,因為js可以被破解和修改,都是寫在後端的。

『捌』 用springboot怎麼做抽獎抽積分功能,演算法與微信紅包類似急急急

這個比較細的,如果沒基礎建議先去學習spring mvc 及 spring boot 的基礎開發功能
但簡單來說,可以分為:
1、寫一個抽獎頁面
2、寫一個控制權Controller
3、寫一個後台紅包對象及對應的Dao對象
4、寫一個Service接收抽獎點擊,並運算後將Dao紅包發給用戶

『玖』 有哪些經典的抽獎演算法

常見的有兩種

第一類是常見的有等級的抽獎活動,如一等、二等、三等獎等等

//分別為一、二、三、四等將的獎品數量,最後一個為未中獎的數量。
privatestaticfinalInteger[]lotteryList={5,10,20,40,100};

privateintgetSum(){
intsum=0;
for(intv:lotteryList){
sum+=v;
}
returnsum;
}

privateintgetLotteryLevel(){
Randomrandom=newRandom(System.nanoTime());
intsum=getSum();
for(inti=0;i<lotteryList.length;++i){
intrandNum=Math.abs(random.nextInt())%sum;
if(randNum<=lotteryList[i]){
returni;
}else{
sum-=lotteryList[i];
}
}
return-1;
}

第二類是不分等級的抽獎活動,僅需要參與人數與獎品總數,各獎品中獎概率相等。

//另一種抽獎演算法,用於公司抽獎,即總參與人數與獎品數固定。
=75;
privatestaticfinalinttotal=175;
privatestaticSet<Integer>lotterySet=newHashSet<Integer>();
static{
for(inti=1;i<=lotteryNum;++i){
lotterySet.add(total*i/lotteryNum);
}
}
privateintgetLotteryNum2(){
Randomrand=newRandom(System.nanoTime());
intrandNum=Math.abs(rand.nextInt())%total;
if(lotterySet.contains(randNum)){
returnrandNum*lotteryNum/total;
}
return-1;
}

『拾』 C#怎麼實現抽獎概率的演算法

很簡單,用隨機數啊

軟糖二話不說就上代碼

int幾率=(newRandom).Next(1,100000);

if(幾率<=5){Console.WriteLine("恭喜您中了特等獎");}
elseif(幾率<=100){Console.WriteLine("恭喜您中了一等獎");}
elseif(幾率<=2000){Console.WriteLine("恭喜您中了二等獎");}
else{Console.WriteLine("真遺憾,什麼都沒中。");}

如滿意,請採納,謝謝