2017-06-23 6 views
0

に戻る私は、この例のコードを持っての場合とNodejsまたはJava

var randFriend = friendList[Math.floor(Math.random() * friendList.length)]; 
if (randFriend == admin) { 
    //Here 
} 
else if (randFriend != admin) { 
    client.removeFriend(randFriend); 
} 

if randfriend == adminが再びvar randFriend = friendList[Math.floor(Math.random() * friendList.length)];を行うと、再びif(randFriend == admin)をチェックする場合、私はどのように行うことができます。つまり、もう一度再起動します。

リターンでやったと思いますが、わかりません。あなたが呼び出すことができるように、おかげ

+1

'do {randFriend =/* pick random * /; } while(randFriend == admin); ' –

+3

' java!= javascript' – Andreas

+0

[Array.prototype.filter](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects)を使用してください。/array/filter)を 'friendList'に追加して、' admin'と等しくない要素だけを含むリストを取得し、フィルタリングされたリストからランダムな項目を選びます。 –

答えて

0

私が正しく質問を理解していた場合は、管理者が

var friendAdmin = true; 
var randFriend; 
while(friendAdmin){ 
    randFriend = friendList[Math.floor(Math.random() * friendList.length)]; 
    if(randFriend != admin) friendAdmin = false; 
} 
client.removeFriend(randFriend); 
+0

Andy Turnerのコメントはこれより簡潔ですが、同じことを実現します – littlespice3

0

が選択されていないまであなたがランダムに保つために、whileループを使用することができ、私は機能にコードを置きますそれを繰り返す場合は、再度関数を呼び出します。たとえば:その後、

function choose(){ 
     var randFriend = friendList[Math.floor(Math.random() * friendList.length)]; 
     if(randFriend == admin){ 
      choose(); //this repeats the choose function, which will run the random friend code again 
     } 
     else if(randFriend != admin){ 
      client.removeFriend(randFriend); 
      return; //this exits the function 
     } 
    } 
+0

このようなタスクには再帰を使用しないでください。この特定の例では、それは問題ではないかもしれませんが、まだ良い解決策ではありません。 –

+0

なぜですか?特に、この関数がより複雑になると、条件文を再実行するためのループの複雑さが軽減される可能性があります。新しいスタックフレームを設定するのは高額になる可能性があると理解していますが、この方法はある時点では便利で分かりやすくなります。 – Ryan

+0

ユースケースが変更され、より多くの要素が無視されるべき条件を満たす場合、ある時点でスタックオーバーフローが発生する可能性が高くなります。これは必ず再帰で真ですが、ランダムな条件での再帰は決して良いアイデアではありません。実際の実行時間を知ることは決してないからです。同じような問題があります。フィルタリングはIMHOだけ良い解決策です。 –

1

私は、再帰を使用していないだろうか、ランダムな条件でループし、あなたはランタイムを推定するのに問題がありますので、使用のケースが変更された場合、あなたはあなたが無視する多くの要素を持っているでしょう正しい要素を見つける確率は減少します。

もっと良いアイデアは、無視する要素を削除するために配列をフィルタリングし、そのリストからランダムな要素を選ぶことです。

var nonAdminList = friendList.filter(person => person != admin); 

if(nonAdminList.length === 0) { 
    throw new Error('no non admin persons available'); 
} 

client.removeFriend(nonAdminList[Math.floor(Math.random() * nonAdminList.length)]); 
関連する問題