2017-01-05 5 views
2

私はJavaScriptで同じ言葉を繰り返すことなく、ランダムに単語のパラグラフを再構築しようとしています:ブラウザ(JavaScriptの)

var para = 'dashing through the snow' + 
     ' in a one horse open sleigh' + 
     ' over the fields we go' + 
     ' laughing all the way'; 
console.log(para); 
function getRandomNumber(min, max) 
{ 
    return Math.floor(Math.random() * (max - min)) + min; 
} 

var words = para.split(' '); 
var newPara = ''; 

for(var i = 0; i < words.length - 1; i++) 
{ 
    var curWord = words[getRandomNumber(0,words.length - 1)]; 

    if(newPara.indexOf(curWord) == -1) 
    { 
    newPara += curWord + ' '; 
    console.log(newPara); 
    } else 
    { 
    i--; 
    } 

} 

コードは、単語の配列に段落を分割し(全部で19 )。私はループを使用してこの配列をループし、単語がnewPara文字列に追加されているかどうかを確認しながらランダムに単語を選択します。それがなければ、私はそれを追加します。もしあれば、私はループ実行から1を引きます。問題は、else文を使用してループから1つを減算すると、スクリプトによってブラウザがフリーズすることです。この問題の助けに感謝します。

私はこの編集を行ったコメントに基づいて:

if(newPara.length <= words.length) 
    { 
    if(newPara.indexOf(curWord) == -1) 
    { 
     newPara += curWord + ' '; 
     console.log(newPara); 
    } else 
    { 
     i--; 
    } 
    } 

しかし、私はまだ同じエラーを取得しています。

+0

配列の長さから1を引いてはいますが、配列自体のサイズは決して減らされません。無限です。 –

+0

'elseの目的は何ですか? { i--; } '? – guest271314

+0

'else {i--}'は、単語が既に新しい段落に存在する場合、ループ実行から1を引きます。あなたが言っていることを私が思うと思う。ここで意味することは: 'words [getRandomNumber(0、words.length - 1)];または' i - ; 'を意味する –

答えて

2

私が思いついた解決策は、words.lengthから0に逆戻りして作業し、すでに使用されている場合はその単語を配列から削除することです。

Fiddle

var para = 'dashing through the snow' + 
 
    ' in a one horse open sleigh' + 
 
    ' over the fields we go' + 
 
    ' laughing all the way'; 
 

 
function getRandomNumber(min, max) { 
 
    return Math.floor(Math.random() * (max - min)) + min; 
 
} 
 

 
var words = para.split(' '); 
 
var newPara = ''; 
 

 
for (var i = words.length; i > 0; i--) { 
 

 
    var rand = getRandomNumber(0, words.length - 1), 
 
    curr = words[rand]; 
 

 
    if (newPara.indexOf(curr) == -1) { 
 
    newPara += curr + ' '; 
 
    words.splice(rand, 1); 
 
    } 
 

 
} 
 

 
console.log(newPara);

+0

残っている唯一の問題は、@ Y.Cに記載されている重複する単語の問題を修正することです。以下。たとえば、「the」は3回表示されます。私は19ワードの段落に終わるはずですが、私は13ワードの段落に過ぎません。 –

+0

ああ!このコードでは、if文はまったく必要ありません。 'words.splice'はアイテムのインデックスを削除して再び表示されないようにします。本当にありがとう! –

0

あなたが作成していることは無限ループです。すでに使用されている単語が乱数ジェネレータによって2回以上選択された場合、ループカウンタは2だけ減算されます。最終的にすべての単語が使用された場合(選択された1〜2回だけと仮定できます)、iは常にwords.lengthより小さい(したがって、条件は決して満たされません)。

可能な解決策は、段落の長さを変数に保存し、ループ状態で使用することです。その後、選択したすべての単語について、words配列から削除します。

これは無限ループに終わらず、単語を見つけようとするとミスがなくなるため、繰り返し回数も最小限に抑えられます。

0

は、このコードを試してみてください。

var para = 'dashing through the snow' + 
    ' in a one horse open sleigh' + 
    ' over the fields we go' + 
    ' laughing all the way'; 
var words, newPara = ''; 
console.log(para); 

words = para.split(' '); 

words.sort(function(a, b) { 
    return 0.5 - Math.random(); 
}); 

newPara = words.join(' '); 
console.log(newPara); 

あなたのコードに問題があなたのparaでいくつかの単語が '3回発生し、それが条件会うことはありません言葉のように、数回繰り返されていることである:i === words.length - 1を。

var para = 'dashing through the snow' + 
    ' in a one horse open sleigh' + 
    ' over the fields we go' + 
    ' laughing all the way'; 

も、それは非常に難しいそれを動作させるだろうgetRandomNumber(0, words.length - 1)getRandomNumber(0, words.length)に変え、最後の数words[words.length-1]を取得することができ、あなたの乱数発生アルゴリズムのバグがあります。

+0

は私に、これら2つの項目が説明でした: 'words.sort(関数(B){ リターン0.5 - Math.random(); });'と 'newPara = words.join(」' ); ' –

+0

MDN、Array.prototype.sort()[link](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort)に参照があります。 、Array.prototype.join()[link](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/join) –

+0

join()メソッドは、すべての要素を結合します。 sort()メソッドは、指定されたメソッドに従って配列の要素をソートし、配列を返します。 –

関連する問題