2012-11-14 27 views
2

我需要一個函數,在用戶指定的數字範圍內(在-9999到9999之間)和用戶指定的數字限制內生成一個完全隨機的整數(非常重要)在1到4位之間)。JavaScript函數:生成一個隨機整數在指定的範圍內和數字限制

實施例1:如果用戶想要-9999和9999這4位之間的一個數,下面的數字將有資格的選擇-9999 -1000和1000到9999之間。

實施例2:如果用戶希望25和200之間的數字是2或3位數字,下面的數字將是符合條件的選擇25至200.

我寫了一個函數,但我不確定它是否是最佳解決方案?有重複的代碼,我不認爲它是完全隨機的?

// Generates a random integer 
// Number range 
// Min (-9999-9999) 
// Max (-9999-9999) 
// Digit limit 
// Min (1-4) 
// Max (1-4) 

function generateRandomInteger(minNumber, maxNumber, minDigits, maxDigits) {  

// Generate a random integer in the number range 
var num = Math.floor(Math.random() * (maxNumber - minNumber)) + minNumber; 

// Find number of digits 
var n = num.toString(); 
n = n.length; 

// If number is negative subtract 1 from length because of "-" sign 
if (num < 0) { 
    n--; 
} 
// End: find number of digits 


while ((n > maxDigits) || (n < minDigits)) { 
    // Generate a random integer in the number range 
    num = Math.floor(Math.random() * (maxNumber - minNumber)) + minNumber; 


    // Find number of digits 
    var n = num.toString(); 
    n = n.length; 

    // If number is negative subtract 1 from length because of "-" sign 
    if (num < 0) { 
     n--; 
    } 
    // End: find number of digits 
} 

return num; 
} 
+0

「完全隨機的整數(非常重要)」。僅供參考'Math.random'遠不是「完全隨機的」。如果你想隨機使用['crypto.getRandomValues'](https://developer.mozilla.org/en-US/docs/DOM/window.crypto.getRandomValues)。 –

回答

1

那麼這裏是一個版本的功能仍使用完全相同的方法(即保持,直到它得到一個與數字的權數生成的數字),但與重複代碼消除:

function generateRandomInteger(minNumber, maxNumber, minDigits, maxDigits) { 
    var num, digits; 
    do { 
     num = Math.floor(Math.random() * (maxNumber - minNumber)) + minNumber; 
     digits = Math.abs(num).toString().length; 
    } while (digits > maxDigits || digits < minDigits); 
    return num; 
} 

至於你是否真的隨機,Math.random()方法會給你一個「僞隨機」的數字,但至少你知道它可以在所有當前的瀏覽器中工作。

+0

+1「do ... while」,容易遺忘但有用。 – elclanrs

1

嘗試這種功能方法,它會創建一個數組並隨機混洗它,從而給出「非常隨機」的結果。我以前用過它,結果非常令人滿意。

function getLen(v) { 
    return Math.abs(v).toString().length; 
}; 
function randomInteger(min, max) { 
    return (new Array(++max - min)) 
    .join('.').split('.') 
    .map(function(v,i){ return [ Math.random(), min + i ] }) 
    .filter(function(v){ return getLen(v[1]) >= getLen(min) }) 
    .sort().map(function(v) { return v[1] }).pop(); 
} 
+0

查看演示,它適用於正數和負數。 http://jsbin.com/awanib/2/edit – elclanrs

+0

+1。我刪除了以前的評論,因爲我通過更仔細地查看代碼來回答自己的問題。我確實有一個問題:改變第一個'.map()'返回'[Math.random(),min + i]'會更有效率,從而消除第二個'.map()' '.filter()'改爲匹配)? – nnnnnn

+0

你說得對。我只是很快修改了[我的另一個腳本](http://jsfiddle.net/elclanrs/QBVbr/),其中的要求有點不同。 – elclanrs

相關問題