2015-01-07 36 views
2

這可能有一個簡單的解決方案,但由於某種原因,我似乎無法在網站或網絡上的其他地方找到它。試圖從數組中產生一個隨機長度的句子。這裏有一個例子:如何從數組中隨機化句子長度

​​3210

這裏是我目前使用隨機化數組的內容的代碼,但它總是產生,每一個字符串使用一次的句子。我想要不同的句子長度。

function fisherYates(words) { 
var i = words.length, j, tempi, tempj; 
if (i == 0) return false; 
while (--i) { 
    j = Math.floor(Math.random() * (i + 1)); 
    tempi = words[i]; 
    tempj = words[j]; 
    words[i] = tempj; 
    words[j] = tempi; 
    } 
    return words; 
} 

建議?

+1

Fisher Yates是一種混洗算法。它不會改變輸入數組的長度。 –

+0

是的,我知道。這就是爲什麼我說我用它來隨機化數組的內容。我正在尋找一段代碼來跟隨它,這將產生一個隨機長度的句子。 – Tom

+0

他使用**我**爲** words.length **,所以,你會抓住一切。您需要將** i **設置爲您想要的最小單詞與最大單詞之間的隨機數。 – klauskpm

回答

1

如果你不想重複的字符串,複製數組和拼接從它的隨機成員形成新的集合。只需從隨機位置拼接隨機數字的字符串即可。

function randWords(arr) { 

    // Copy original array 
    arr = arr.slice(); 

    // Random number of words to get 
    var len = (Math.random() * arr.length + 1)|0; 
    var result = []; 

    // Randomly fill result from arr, don't repeat members 
    while (len--) { 
    result.push(arr.splice(Math.random()*arr.length|0, 1)); 
    } 
    return result; 
} 

console.log(randWords(["yes", "ok", "java", "pull my hair out", "sleep"]).join(' ')); 
+0

這很好,謝謝。對於任何想知道如何實現這個的人來說,我只是在函數之前聲明瞭我的數組,然後在函數定義之後將該函數應用於變量,如下所示:var ds_random = randwords(arr);'。簡單而有效。 – Tom

2

我建議你選擇一個隨機數m1n(其中n是你想要的句子的最大長度)。然後你隨機選擇從陣列m項目,並把它們放入一個新的數組:

var words = ["yes", "ok", "java", "pull my hair out", "sleep"]; 
 

 
alert(randomize(words, 10).join(" ") + "."); 
 

 
function randomize(array, maximum) {     // array, n 
 
    var length = Math.ceil(maximum * Math.random()); // m 
 
    var result = new Array(length); 
 
    var count = array.length; 
 
    var index = 0; 
 

 
    while (index < length) { 
 
     result[index++] = array[Math.floor(count * Math.random())]; 
 
    } 
 

 
    return result; 
 
}

希望有所幫助。

Java Sex

也許不是。

+0

重複單詞的機率是多少? – RobG

+0

相當多,但結果滑稽。 –