2017-12-14 5 views
0

私はランダムな数学的問題(簡単な質問)を作成するスクリプトに取り組んでいます。問題は、無限ループが発生しているようで、コードのこの部分がなくてもどこでどのようにスクリプトを実行できるのか分かりません。乱数を生成する無限ループですか?

https://codepen.io/abooo/pen/GyJKwP?editors=1010

var arr = []; 
var lastArr = []; 


while(lastArr.length<122){ 
    arr.push('<br>'+Math.round(Math.random() * 10)+'+'+Math.round(Math.random() * 10)+'='); 
    lastArr=removeDuplicates(arr); 

} 
document.write(lastArr.join(' ')); 

alert(arr.length); 


function removeDuplicates(arr){ 
    let unique_array = [] 
    for(let i = 0;i < arr.length; i++){ 
     if(unique_array.indexOf(arr[i]) == -1){ 
      unique_array.push(arr[i]) 
     } 
    } 
    return unique_array 
} 
+0

はい、inifiteループが、非常にlooooooongループはありません。重複を削除していますが、最大121の異なるオプションしか存在しません。したがって、1から121までのすべての乱数を見つけたら、終了することができます。これは非常に小さなチャンスです。だからそこに着くには長い時間がかかります。私はあなたがマルコフチェーンを行う必要が実際のチャンスを計算すると信じて –

+0

あなたの問題は、理論的に無限ループが可能であるときにあなたが乱数に頼っているとき、コードペンは実行を停止することによって何かばかげた –

+0

また、セットを使用して調べます。それはユニークな値を格納するように設計されています –

答えて

0

ラインMath.round(Math.random() * 10)はあなたに(0から10まで)11の可能な結果が得られます。これは、11 * 11の重複がないことを意味します。lastArrが保持できます。

コメントに記載されているように、すべての可能性のために時間がかかるだけでなく、121(11 * 11)よりも長くなることも不可能です。条件while(lastArr.length<122)

所望の結果を達成するためのより良い方法は、このはそれを動作させるだろうにあなたのコードを変更することがあることに加えて:

var arr = []; 
var lastArr = []; 


while(lastArr.length<121){ // Here I change 122 to 121 
    arr.push('<br>'+Math.round(Math.random() * 10)+'+'+Math.round(Math.random() * 10)+'='); 
    lastArr=removeDuplicates(arr); 

} 
document.write(lastArr.join(' ')); 

alert(arr.length); 


function removeDuplicates(arr){ 
    let unique_array = [] 
    for(let i = 0;i < arr.length; i++){ 
     if(unique_array.indexOf(arr[i]) == -1){ 
      unique_array.push(arr[i]) 
     } 
    } 
    return unique_array 
} 
0

これは、任意の無限ループのない作業スニペットです。

var arr = []; 
 
while(arr.length < 121){ 
 
    var randValue = '<br>'+Math.round(Math.random() * 10)+'+'+Math.round(Math.random() * 10)+'=' 
 
    arr.push(); 
 
    // Check duplicate elements before push 
 
    if (arr.indexOf(randValue) == -1) arr.push(randValue); 
 
} 
 
document.write(arr.join(' ')); 
 
alert(arr.length);

+0

最大10個の乱数の場合、配列を埋めるのに平均650回の試行が必要です。 100までの数字の場合、平均ロケットは100,046回まで "試行"されます。この全体的なアプローチは非常に非効率的であり、実行前にブラウザーがプロセスを終了させる確率がゼロでないことがあります。 –

0

あなたはむしろpidgeonholesと希望に投げミサイル」のあなたの試みよりも、それをしないのはなぜ0から10に2つの数値を追加することの可能なすべての結果をシャッフルしようとしているように見えます最高のために "?

function generateArray(maxA, maxB) { 
 
    var arr = [], 
 
    a, b; 
 
    for (a = 0; a <= maxA; a++) { 
 
    for (b = 0; b <= maxB; b++) { 
 
     arr.push([a, b]); 
 
    } 
 
    } 
 
    return arr; 
 
} 
 

 
function shuffleArray(arr) { 
 
    // simple Fisher-Yates shuffle, modifies original array 
 
    var l = arr.length, 
 
    i, j, t; 
 
    for (i = l - 1; i > 0; i--) { 
 
    j = Math.floor(Math.random() * (i + 1)); 
 
    t = arr[i]; 
 
    arr[i] = arr[j]; 
 
    arr[j] = t; 
 
    } 
 
} 
 

 
function outputArray(arr) { 
 
    var i, l = arr.length; 
 
    for (i = 0; i < l; i++) { 
 
    document.write("<br />" + arr[i][0] + " + " + arr[i][1] + " = "); 
 
    } 
 
} 
 

 
var arr = generateArray(10, 10); 
 
shuffleArray(arr); 
 
outputArray(arr);

関連する問題