2017-09-06 412 views
1

我試圖構建一個隨機的JS單詞列表生成器,但我在這裏的代碼只生成一個單詞。實際上,我希望它能夠從之前給出的列表中生成30個單詞的列表,它可以是60個單詞列表或700個單詞,但結果應該總是30個,沒有重複的單詞,但我不知道如何實現這個目標。用JS生成隨機單詞列表

另外,我想觀衆介紹自己的單詞列表,然後點擊「生成字的新列表」,然後頁面會隨機給他們的30個字有不同的順序列表,他們每次點擊按鈕。

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" 
    "http://www.w3.org/TR/html4/strict.dtd"> 
<html lang="en"> 
<head> 

<meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 
<meta name="language" content="english"> 
<meta http-equiv="Content-Style-Type" content="text/css"> 
<meta http-equiv="Content-Script-Type" content="text/javascript"> 

<title></title> 

<style type="text/css"> 
form { 
    float:left; 
    padding:20px 20px 10px; 
    border:1px solid #999; 
} 
label { 
    float:left; 
    width:100px; 
    line-height:22px; 
    margin-bottom:10px; 
    font-size:12px; 
} 
input { 
    margin-bottom:10px; 
} 
</style> 

<script type="text/javascript"> 

function init(){ 

    words0=['art','car','bus','earth','camera','phone','sun','light','number',]; 


    df=document.forms[0]; 
    df.reset(); 

df[1].onclick=function() { 

    rnd0=Math.floor(Math.random()*words0.length); 


    df[0].value=words0[rnd0]; 

    } 
} 
    window.addEventListener? 
    window.addEventListener('load',init,false): 
    window.attachEvent('onload',init); 

</script> 

</head> 
<body> 

<form action="#"> 
<div> 

<label>word one:</label><input type="text" readonly="readonly"><br> 

<input type="button" value="Click here to get random words"> 
<input type="reset" value="Clear"> 

</div> 
</form> 
</body> 
</html> 
+0

順便說一句,更好地擺脫像'words0'或''rnd0'變量rnd1'名.. –

+0

要從一個較大的集合中挑選n個隨機項目,[shuffle](https://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle),然後取第一個'n'項目。 – Phylogenesis

+0

然後你必須迭代,每次檢查新的隨機單詞是否不在你生成的單詞列表中,並且這樣做直到你有30個單詞。類似於:do var newWord = Math.floor(Math.random()* words0.length); if(wordsArr.indexOf(newWord)=== -1){wordsArr.push(newWord); counter ++;} } while(counter <30); – user2520818

回答

1

如果你想從一個數組中隨機抓取的N個項目,那麼這是一種經典的方式是:

  1. 隨機洗牌的陣列,
  2. 回暖的N個第一項suffled陣列

示例代碼:

function samples(items, number){ 
    items.sort(function() {return 0.5 - Math.random()}); 
    return items.slice(0, number); 
} 

請注意,shuffle算法可能不是最好的,它是作爲一個例子提供的,如@Phylogenesis所提到的。

如果你希望避免重塑車輪,你也可以使用undercore.js例如,提供了一個sample method

+0

這是一個[非常糟糕的洗牌算法](http://www.robweir.com/blog/2010/02/microsoft-random-browser-ballot.html)。使用[Fisher-Yates](https://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle)。 – Phylogenesis

+0

@Phylogenesis你是對的,但它很容易理解和實施。順便說一句,我已經添加了一個通知,告知該算法可能不是最好的;) –