前言:
? ? ? 在學習js的初級階段我們大概率會遇上一個經典的題目如何生成驗證碼择诈,一開始我們做的一般是生成數字驗證碼昙篙,這個問題比較簡單昧旨,只要在循環(huán)中嵌入一個random方法就可以了劳翰。之后要求一般會提升為生成數字和字母混合驗證碼。在處理混合驗證碼的時候您机,許多同學會犯一個比較嚴重的錯誤,就是取的內容不夠真正的隨機年局。
? ? ? 我一開始在考慮這個問題的時候际看,思路是先生成一個數組用來裝數字,再生成兩個數組分別盛裝大小寫字母矢否。最后利用concat方法將三個數組拼接在一起仲闽,然后隨機從中取四位數。這種方法確實能生成四位數字和字母驗證碼僵朗,但是卻是錯的赖欣,因為它并沒有做到真正的隨機。在拼接的數組中验庙,一共有10位數字+26大寫字母+26小寫字母顶吮。如果我們從其中抽取一位字符,那么抽取到數字和大小寫字母的概率還相同嗎粪薛?
? ? ? 下面介紹一種方法悴了,這種方法的思路是先建立一個數據庫,這個數據庫中包含數字违寿,和大小寫字母让禀。數據庫的數據數量不限(是你驗證碼位數的整數倍),但是要保證數字和大小寫字母的數量是相同陨界。然后從數據庫中隨機抽取四位葱绒。
代碼:
<!DOCTYPE html>
<html lang="en">
? ? <meta charset="UTF-8">
? ? <title>Title
? ? //建庫
? ? function rs() {
var str ="";
? ? ? ? for(var i=0;i<4;i++){
var num =random(0,9);
? ? ? ? ? ? var az =String.fromCharCode(random(97,122));
? ? ? ? ? ? var AZ =String.fromCharCode(random(65,90));
? ? ? ? ? ? str += str+num+az+AZ;
? ? ? ? }
//開始真正的隨機抽取四個
? ? ? ? var stq ="";
? ? ? ? for(var j=0;j<4;j++){
stq += str[random(0,str.length-1)]
}
return stq;
? ? }
console.log(rs());
? ? function random(a,b) {
return Math.round(Math.random()*(a-b)+b);
? ? }
</html>
結果如圖:
總結:
????代碼本身并不難菱鸥,重點是不能陷入誤區(qū),和這一題易錯點相似的還有隨機生成六位十六進制顏色值的問題,許多同學在做一這題的時候每一位都直接從包含數字和字母的數組中隨機生成一位字符忽媒,最后拼接在一起,這其實還是陷入了概率誤區(qū)花颗。