春節在家無聊,搶紅包的時候想起來,不如自己寫一個微信搶紅包算法來練練手。本以為是非常簡單的一個事情,但真正寫下來也算是一波三折,不禁感嘆,在程序員的路上,我還是太嫩了?。戇@篇文章的原因也是想與廣大網友集思廣益,獲得更好的學習。
基本思路
基本思路很簡單,用戶可以輸入紅包個數和紅包總金額,然后點擊生成按鈕,就能生成一組隨機數。效果圖如下:
Paste_Image.png
圖方便,引入vue的數據綁定,代碼如下:
<div id="wrapper">
隨機數個數<input type="text" v-model='num'><br>
隨機數之和<input type="text" v-model='sum'><br>
<button v-on:click='getRandom'>生成隨機數</button>
<ul>
<li v-for='item in list'>
{{item}}
</li>
</ul>
</div>
<script src='node_modules/vue/dist/vue.min.js'></script>
var vi=new Vue({
el:'#wrapper',
data:{
num:0,
sum:0,
list:[],
},
methods:{
getRandom:function(){
var app=this
var isOk=false
while(!isOk){
for (var i = app.num-1,sum_2=0,exist=0,list=[]; i >= 0; i--) {
list[i]=parseFloat((Math.random()*(parseFloat(app.sum)-exist)).toFixed(2))
sum_2+=list[i]
exist+=list[i]
}
console.log(list)
if (sum_2==parseFloat(app.sum)) {
isOk=true
app.list=list
}
}
},
},
})
代碼邏輯并不復雜,相信大家能夠看得懂,就不多做解釋了。我更想提的是一個bug,生成隨機數后,會出現分布不均勻的現象。
下面附上5次隨機生成結果:
Paste_Image.png
Paste_Image.png
Paste_Image.png
Paste_Image.png
Paste_Image.png
相信大家發現了,前面生成的數會很大,后面生成的數會非常小,但檢查代碼并沒有邏輯錯誤。如果廣大網友如果有所想法,請在評論區留言,不勝感激!