之前和大家分享了一部分web前端開發(fā)(http://www.maiziedu.com/course/web-px/)之Javascript中的隨機數(shù),希望對大家有用。今天繼續(xù)給大家案例。廢話不多說,見下文:
隨機洗牌
隨機洗牌在JavaScript中是一個典型的算法,創(chuàng)建一個數(shù)組,通過洗牌算法,將結(jié)果放在一個新數(shù)組,然后每次彈出一個數(shù)組元素:
var numPool = [13, 21, 36, 14, 27, 10];
function shuffle (numPool) {
for (var j, x, i = numPool.length; i; j = parseInt(Math.random() * i), x = numPool[--i], numPool = numPool[j], numPool[j] = x);
return numPool;
}
var randomResult = shuffle(numPool);
while (randomResult.length > 0) {
console.log(randomResult.pop());
}
上面的示例是在創(chuàng)建的數(shù)組中做隨機排序,然后將數(shù)組的每個元素取出來。下面我們來看另一個示例,從一個范圍內(nèi)(比如 0~1000 )隨機取 12 數(shù),并將他們創(chuàng)建成一個數(shù)組,同時取出數(shù)組中最后一個子元素。
var numReserve = [];while (numReserve.length < 12) {
var randomNumber = Math.ceil(Math.random() * 1000);
var found = false;
for (var i = 0; i < numReserve.length; i++) {
if (numReserve === randomNumber) {
found = true;
break;
}
}
}if (!found) {
numReserve[numReserve.length] = randomNumber;
}
隨機密碼這些方法創(chuàng)建一個隨機數(shù)字是足夠了,但要使用 Math.random() 創(chuàng)建一個加密的隨機安全密碼是 指數(shù)數(shù)據(jù)計算方案 ,來避免這種錯誤:
function round(value, decimals) {
return Number(Math.round(value+'e'+decimals)+'e-'+decimals);
}
round(1.005,2); // => 1.01
Epsilon( ε )舍入在ES6中提供了另一種方法,處理小數(shù)四舍五入。 Machine epsilon 提供了一個合理的方法,比較兩個浮點數(shù)合理處理這個誤差。
在Chrome的控制臺中輸入:
0.1 + 0.2 // => 0.300000000000000040.1 + 0.2 === 0.3 // => false
通過 Math.EPSILON 函數(shù)可以做出一個正確的比較:
function epsEqu(x, y) {
return Math.abs(x - y) < Number.EPSILON * Math.max(Math.abs(x), Math.abs(y));
}
Math.EPSILON 接受兩個參數(shù),一個是需要計算的表達式,另一個是需要做為比較的預(yù)期結(jié)果,然后用這兩個值作為比較:
epsEqu(0.1 + 0.2, 0.3); // => true
如果有什么不對的地方,還希望大家多多指出,共同進步!